如果我有一个无限循环的线程,有没有办法在主程序结束时终止它(例如,当我按 Ctrl + C )?
答案 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。