fac*_*cha 74 python multithreading python-multithreading
如果我有一个无限循环的线程,有没有办法在主程序结束时终止它(例如,当我按Ctrl+ C)?
ʇsә*_*ɹoɈ 86
如果你创建了你的工作线程守护程序线程,那么当所有非守护程序线程(例如主线程)退出时,它们将会死亡.
http://docs.python.org/library/threading.html#threading.Thread.daemon
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
小智 9
如果你像这样产生一个线程myThread = Thread(target = function)- 然后做myThread.start(); myThread.join().启动CTRL-C时,主线程不会退出,因为它正在等待阻塞myThread.join()调用.要解决此问题,只需在.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()
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),其他线程将按照上述说明被杀死。
守护进程线程被不正常地终止,因此任何终结器指令都不会执行。一个可能的解决方案是检查主线程是否处于活动状态而不是无限循环。
例如对于 Python 3:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
136493 次 |
| 最近记录: |