如果我在无限循环的螺纹,有一个方法来终止它,当主程序结束(例如,当我按 <强>控制 + <强> 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()

请参阅检查主线程仍然活着从另一个线程

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top