python:如何在主程序结束时终止一个线程

时间:2010-04-01 22:44:53

标签: python multithreading python-multithreading

如果我有一个无限循环的线程,有没有办法在主程序结束时终止它(例如,当我按 Ctrl + C )?

6 个答案:

答案 0 :(得分:82)

如果您创建了工作线程守护程序线程,那么当所有非守护程序线程(例如主线程)退出时,它们将会死亡。

http://docs.python.org/library/threading.html#threading.Thread.daemon

答案 1 :(得分:40)

检查此问题。正确的答案有很好的解释如何以正确的方式终止线程: Is there any way to kill a Thread in Python?

要使线程在键盘中断信号(ctrl + c)上停止,您可以在退出之前捕获异常“KeyboardInterrupt”并清除。像这样:

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()

通过这种方式,您可以控制在程序突然终止时要执行的操作。

您还可以使用内置信号模块来设置信号处理程序(在您的特定情况下为SIGINT信号):http://docs.python.org/library/signal.html

答案 2 :(得分:12)

使用Python标准库的atexit模块来注册在主线程的任何合理“干净”终止时调用(在主线程上)的“终止”函数,包括未捕获的异常,例如{{ 1}}。这样的终止函数可能(虽然不可避免地在主线程中!)调用你需要的任何KeyboardInterrupt函数;以及将线程设置为stop的可能性,为您提供了正确设计所需系统功能的工具。

答案 3 :(得分:8)

如果你产生这样的线程 - myThread = Thread(target = function) - 然后做myThread.start(); myThread.join()。启动CTRL-C时,主线程不会退出,因为它正在等待阻塞myThread.join()调用。要解决此问题,只需在.join()调用上设置超时。超时可以是您想要的长度。如果你想让它无限期地等待,只需加入一个非常长的超时,比如99999.执行myThread.daemon = True也是一种好习惯,这样当主线程(非守护进程)退出时所有线程都会退出。

答案 4 :(得分:7)

尝试将子线程启用为守护程序线程。

例如:

from threading import Thread

threaded = Thread(target=<your-method>)
threaded.daemon = True  # This thread dies when main thread (only non-daemon thread) exits.
threaded.start()

或(一行):

from threading import Thread

threaded = Thread(target=<your-method>, daemon=True).start()

当您的主线程终止时(例如,当我按下 Ctrl + C ”时)上面的指令会杀死其他线程。

答案 5 :(得分:0)

守护进程线程会被恶意杀死,因此不会执行任何终结器指令。 一种可能的解决方案是检查主线程是否仍然存在而不是无限循环。

例如对于Python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

请参见Check if the Main Thread is still alive from another thread