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

fac*_*cha 74 python multithreading python-multithreading

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

ʇsә*_*ɹoɈ 86

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

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

  • `isDaemon()` 和 `setDaemon()` 是旧的 getter/setter(根据上面的链接文档),只需在 `threading.Thread()` 中使用 `daemon=True` (5认同)
  • 感谢简单而精确的答案,默认的threading.Thread守护进程状态`isDaemon()`为False,通过`setDaemon(True)`设置为True. (4认同)
  • 这可以回答问题,并且可以正常工作。操作员通常不询问如何干净地退出线程。 (2认同)
  • 请注意,使用守护线程可能会导致其他问题,并且可能不是您想要的:/sf/ask/1441784291/解释器关闭/20598791#20598791 (2认同)

rog*_*pvl 42

检查这个问题.正确的答案有很好的解释如何以正确的方式终止线程: 有没有办法杀死Python中的线程?

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

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()
Run Code Online (Sandbox Code Playgroud)

这样,只要程序突然终止,您就可以控制要执行的操作.

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


Ale*_*lli 12

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


小智 9

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

  • @Brannon`.daemon = True`不是一个可靠的解决方案。检查此线程以获取解释:/sf/answers/1441915401/ (2认同)

Ben*_*ari 9

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

例如:

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()
Run Code Online (Sandbox Code Playgroud)

或(一行):

from threading import Thread

threaded = Thread(target=<your-method>, daemon=True).start()
Run Code Online (Sandbox Code Playgroud)

当您的主线程终止时(例如,当我按下Ctrl+时C),其他线程将按照上述说明被杀死。

  • 请注意,使用守护线程可能会导致其他问题,并且可能不是您想要的:/sf/ask/1441784291/解释器关闭/20598791#20598791 (2认同)

umi*_*umi 6

守护进程线程被不正常地终止,因此任何终结器指令都不会执行。一个可能的解决方案是检查主线程是否处于活动状态而不是无限循环。

例如对于 Python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()
Run Code Online (Sandbox Code Playgroud)

请参阅检查另一个线程的主线程是否仍处于活动状态


归档时间:

查看次数:

136493 次

最近记录:

6 年,6 月 前