当主线程调用sys.exit()时,其他线程会发生什么?

时间:2013-10-06 12:02:24

标签: python multithreading python-2.7 daemon exit

来自文档:http://docs.python.org/2/library/thread

  

当主线程退出时,系统定义是否为另一个   线程存活。在SGI IRIX上使用本机线程实现,   他们活了下来在大多数其他系统上,它们在没有执行的情况下被杀死   尝试... finally子句或执行对象析构函数。

在这里,在文档(http://docs.python.org/2/library/threading)中,它说:

  

线程可以标记为“守护程序线程”。这个的意义   flag是只有守护进程线程时整个Python程序退出   离开了。初始值继承自创建线程。

我们在这里只讨论非守护进程线程。因为,第一个引用没有对非守护进程线程做任何特殊引用,我认为如果主线程退出,甚至应该杀死非守护进程线程。但是,第二个引用另有说法。实际上,当主线程退出时,非守护进程线程确实没有被杀死。那么,这里首先引用的是什么?

1 个答案:

答案 0 :(得分:10)

您引用的文档来自两个不同的模块:threadthreadingthread是一个低级模块,可以或多或少地直接访问平台对“线程”含义的看法。 threading提供了更高级别的“线程”概念,减少了平台依赖性。

这就是为什么文档说不同的东西。退出时低级thread“线程”发生的事情取决于平台C的线程版本的作用,但无论如何Python都不会尝试 - 或者不 - 干净地关闭它们。

threading.Thread是不同的。 Python正常关机处理的一部分是.join()所有非守护进程threading.Thread线程。因此,在所有非守护进程threading.Thread线程结束之前,程序将不会结束(这是程序员有责任确保的)。请注意,低级thread模块线程没有.join()的概念 - .join()是一个更高级别的概念通过来区分threading模块。

建议:使用threading代替thread,除非您有充分理由使用thread代替threadingthread表现得更好,并提供了许多有用的工具。使用thread时的示例更好?我想不出一个; - )

注意:在Python 3中,低级_thread模块重命名为{{1}}。像往常一样,领先的下划线暗示“最好不要弄乱这个 - 但如果你必须的话就在这里”。