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


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

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

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

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

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


6308
2017-10-06 12:02


起源

编写代码并试一试 - Andreas Jung
这似乎是 thread 模块处理所有内容作为守护程序线程,而 threading 添加了“非守护进程”线程的概念。 - Joachim Isaksson
@ user2799617:我写了代码并得出结论“当主线程退出时,非守护程序线程确实没有被杀死”。这就是为什么,我想知道第一个引用什么时候适用,因为我的系统可能是“大多数其他系统”之一:Ubuntu 12.10运行python 2.7 - gjain
@JoachimIsaksson:谢谢,这确实有意义。我怀疑,但只是需要确认 - gjain
@gjain如果您阅读了线程页面的最后一部分,那么有一些有趣的信息等同于守护程序线程与线程模块创建的线程; “通过仅从通过线程模块创建的非守护程序线程执行导入,可以最轻松地实现这一点。 直接使用线程模块创建的守护程序线程和线程 将需要一些其他形式的同步,以确保它们在系统关闭开始后不会尝试导入。“ - Joachim Isaksson


答案:


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

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

一个 threading.Thread 是不同的。 Python正常关机处理的一部分是 .join() 所有非守护进程 threading.Thread 线程。所以在所有非守护进程之前程序都不会结束 threading.Thread 线程已经结束(程序员有责任确保)。注意低级别 thread 模块线程没有概念 .join()  - .join() 是一个更高层次的概念实施 通过 独特的 threading 模块。

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

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


10
2017-10-06 17:50