Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 主程序结束时如何终止线程?_Python_Multithreading_Python Multithreading - Fatal编程技术网

Python 主程序结束时如何终止线程?

Python 主程序结束时如何终止线程?,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,如果我有一个无限循环中的线程,有没有办法在主程序结束时终止它(例如,当我按下Ctrl键时?+C)?检查这个问题。正确的答案很好地解释了如何以正确的方式终止线程: 要使线程在键盘中断信号(ctrl+c)上停止,您可以捕获异常“KeyboardInterrupt”并在退出之前清除。像这样: try: start_thread() except (KeyboardInterrupt, SystemExit): cleanup_stop_thread() sys.exit(

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

检查这个问题。正确的答案很好地解释了如何以正确的方式终止线程:

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

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()
这样,当程序突然终止时,您可以控制要执行的操作


您还可以使用内置的信号模块来设置信号处理程序(在您的特定情况下为SIGINT信号):

如果您使工作线程成为守护线程,那么当所有非守护线程(例如主线程)退出时,它们将死亡


使用Python标准库的模块注册(在主线程上)在主线程的任何合理的“干净”终止上被调用的“终止”函数,包括未捕获的异常,例如
键盘中断
。这种终止函数可能(尽管不可避免地在主线程中!)调用您需要的任何
stop
函数;以及将线程设置为
守护进程的可能性,这为您提供了正确设计所需系统功能的工具。

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

尝试启用子线程作为守护进程线程

例如: 建议:

from threading import Thread

t = Thread(target=<your-method>)
t.daemon = True  # This thread dies when main thread (only non-daemon thread) exits.
t.start()


当主线程终止(“即,当我按下Ctrl+C”)时,其他线程也将被上述指令终止。

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

例如,对于Python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

请参阅。

非常感谢您的回复。我可能没有正确地陈述这个问题。在该问题给出的示例中,仍然需要执行线程的stop()函数。当我通过ctrl+C异常终止程序时,这是不可能发生的。所以,我的问题有点像,“如果主线程流被中断,我如何调用mythread.stop()函数”是
cleanup\u stop\u thread()
一个我可以使用的全局函数?或者我需要实现它吗?@alper,我想也许这只是一个可以实现某些东西的例子。您应该实现这一点。请注意,在2.6.5之前的Python版本中,这种方法不需要守护线程,请参阅的答案。这是不幸的,因为在Python3.4()之前,关闭期间的守护进程线程有点混乱。如果您停止并在atexit处理程序中加入守护进程线程,一切都会好起来,代价是(可能微不足道)序列化线程拆卸。请注意,由于Python模块中的post-poned
atexit.register()
调用,可能会发生奇怪的事情,使您的终止过程在多处理后执行。我在处理
Queue
daemon
线程时遇到了这个问题:。显然,在现代版本的Python中,如3.7.4+,当非守护线程处于活动状态且主线程退出时,不会调用
atexit
处理程序。请参阅。感谢您提供了简单而准确的答案,默认的线程。线程守护进程状态
isDaemon()
为False,请通过
setDaemon(True)
将其设置为True。这回答了问题,并且可以正常工作。op通常没有询问如何干净地退出线程。
isDaemon()
setDaemon()
都是旧的getter/setter(根据上面链接的文档),只需在
threading.Thread()中使用
daemon=True
请注意,使用守护进程线程可能会导致其他问题,而这可能不是您想要的:要避免使用守护进程线程并干净地杀死线程,请参阅
myThread.daemon=True
是解决此问题的极好方法。@Brannon
。daemon=True
不是一个可靠的解决方案。检查此线程以获取解释:请注意,使用守护进程线程可能会导致其他问题,并且可能不是您想要的:
t.setDaemon(True)
t.start()
while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()