主程序结束时如何终止线程?
- 2025-04-16 08:57:00
- admin 原创
- 13
问题描述:
如果我有一个处于无限循环中的线程,有没有办法在主程序结束时终止它(例如,当我按下Ctrl
+ 时C
)?
解决方案 1:
如果您将工作线程设为守护线程,则当所有非守护线程(例如主线程)退出时,它们将会死亡。
http://docs.python.org/library/threading.html#threading.Thread.daemon
解决方案 2:
看看这个问题。正确答案很好地解释了如何正确终止线程:
在 Python 中,有没有办法终止线程?
要使线程在键盘中断信号(ctrl+c)时停止,可以捕获“KeyboardInterrupt”异常并在退出前进行清理。如下所示:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
这样,您就可以控制程序突然终止时要执行的操作。
您还可以使用内置信号模块来设置信号处理程序(在您的特定情况下为 SIGINT 信号):http://docs.python.org/library/signal.html
解决方案 3:
尝试将子线程启用为守护线程。
from threading import Thread
t = Thread(target=desired_method)
t.daemon = True # Dies when main thread (only non-daemon thread) exits.
t.start()
排队:
t = Thread(target=desired_method, daemon=True).start()
旧 API:
t.setDaemon(True)
t.start()
当你的主线程终止(例如Ctrl
+C
击键)时,其他线程也会按照上述指令被杀死。
解决方案 4:
使用Python 标准库的atexit模块注册“终止”函数,这些函数会在主线程任何合理“干净”的终止(包括未捕获的异常,例如 )时(在主线程上)调用KeyboardInterrupt
。此类终止函数可以(尽管不可避免地在主线程中!)调用stop
您需要的任何函数;加上将线程设置为 的可能性daemon
,这为您提供了正确设计所需系统功能的工具。
解决方案 5:
如果你像这样创建一个线程 - myThread = Thread(target = function)
- 然后执行myThread.start(); myThread.join()
。当 CTRL-C 启动时,主线程不会退出,因为它正在等待那个阻塞myThread.join()
调用。要解决这个问题,只需在 .join() 调用中设置一个超时时间。超时时间可以随意设置。如果你想让它无限期地等待,只需设置一个很长的超时时间,比如 99999。这样做也是一种很好的做法,myThread.daemon = True
即当主线程(非守护进程)退出时,所有线程也都退出。
解决方案 6:
守护线程会被非优雅地终止,因此任何终结器指令都不会被执行。一个可能的解决方案是检查主线程是否处于活动状态,而不是无限循环。
例如对于 Python 3:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
请参阅从另一个线程检查主线程是否仍处于活动状态。
扫码咨询,免费领取项目管理大礼包!