我有一个很长的程序,里面有很多线程。我创建了一个示例,简短的代码,您可以在其中找到问题所在。
from threading import Thread, active_count
import time
def func(x):
time.sleep(x)
print(active_count())
print(active_count())
t = Thread(target=func, name="thread", args=(5,))
t.start()
print("main thread finished")
简单地说 - 我不明白为什么即使在最后一个print语句执行后主线程仍处于活动状态。
可以请有人向我解释为什么这是主线程与其他线程背后的机制是什么?谢谢
答案 0 :(得分:1)
您必须习惯于编译C语言,其中退出主例程会杀死所有内容。
在Python中,到达主线程的末尾并不会破坏其他线程。
事实上,你无法真正破坏线程,这必须是一个协作任务(例如:设置一个标志或发送事件,以便线程理解它必须退出它的循环:在你的情况下,你可能想要分割你的{{ 1}}并检查两者之间的标志,以便在需要时从线程返回
因此,当主线程结束执行时,python解释器会在退出之前等待所有线程完成。
请注意,使用time.sleep()
方法(join
)来实现此等待会更好。
答案 1 :(得分:1)
要实现您想要的功能,您需要在启动它之前将线程标记为守护进程:
t = Thread(...)
t.daemon = True
t.start()
查看文档https://docs.python.org/2/library/threading.html#thread-objects:
线程可以标记为“守护程序线程”。这个标志的意义在于,当只剩下守护程序线程时,整个Python程序都会退出。
主线程不是守护进程,因此将生成的线程标记为守护进程允许您在主线程结束后立即退出程序。