Python中的主线程

时间:2017-11-04 20:25:10

标签: python multithreading

我有一个很长的程序,里面有很多线程。我创建了一个示例,简短的代码,您可以在其中找到问题所在。

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语句执行后主线程仍处于活动状态。

  1. 我定义了一个函数func
  2. 第一个print语句打印数字1 - 活动线程数。由于线程t尚未激活,因此数字1是正确的(仅主线程)
  3. 我定义了线程并执行它。
  4. 当线程t休眠时,主线程完成了最后一个打印语句并且应该完成 BUT
  5. 线程唤醒并打印当前活动线程的数量 - 数字为2 - 主线程和线程t都是(根据python)活动,即使主线程应该已经完成​​,因此不应该因为它已经打印了最后一行(最后一个打印语句)。
  6. 可以请有人向我解释为什么这是主线程与其他线程背后的机制是什么?谢谢

2 个答案:

答案 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程序都会退出。

主线程不是守护进程,因此将生成的线程标记为守护进程允许您在主线程结束后立即退出程序。