蟒蛇:如何终止线程时主程序结束
-
23-09-2019 - |
题
如果我在无限循环的螺纹,有一个方法来终止它,当主程序结束(例如,当我按 <强>控制强> + <强> C 强> )?
解决方案
检查这个问题。正确的答案对如何终止线程的正确方法很好的解释: 有没有办法在Python杀死一个主题?
要作出键盘中断信号的线程停止(CTRL + C),则可以捕捉异常“一个KeyboardInterrupt”和清理飞去。像这样:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
这样,您就可以控制的事,只要程序突然终止。
您还可以使用内置的,可以让你设置信号处理(在特定情况下,SIGINT信号)信号模块:的 http://docs.python.org/library/signal.html
其他提示
如果你让你的工作线程守护线程,当你所有的非守护线程(例如主线程)已经退出,他们会死。
http://docs.python.org/library/threading。 HTML#threading.Thread.daemon
使用 atexit对 Python的标准库的模块对主线程的任何合理的“干净”的终止,包括未捕获的异常,如KeyboardInterrupt
寄存器,被调用(在主线程),“终止”功能。这样的终端功能可以(!虽然不可避免地在主线程)调用你需要的任何stop
功能;连同设置线程作为daemon
的可能性,这为您提供了工具,合理地设计你所需要的系统功能。
如果您生成一个线程像这样 - myThread = Thread(target = function)
- 然后做myThread.start(); myThread.join()
。当CTRL-C被启动,主线程不会退出,因为它正在等待阻断myThread.join()
电话。为了解决这个问题,只是把上。加入()调用超时。超时可以,只要你愿意。如果你想让它无限期地等待,只是把一个很长的超时,如99999。这也是很好的做法做myThread.daemon = True
所以所有的线程退出时,主线程(非守护进程)退出。
与启用子线程作为守护进程线程尝试。
对于实施例:
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()
当你的主线程终止( “例如,当我按 <强>控制强> + <强> C 强> ”),其其他线程杀死与上述指令。
守护进程线程非正常所以任何终结指令不执行杀死。 一种可能的解决方案是检查是主线程是活动的,而不是无限循环。
E.g。用于Python 3:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
请参阅检查主线程仍然活着从另一个线程。