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

14
根据文档:http://docs.python.org/2/library/thread 当主线程退出时,其他线程是否继续运行由系统定义。在使用本机线程实现的 SGI IRIX 上,它们会继续运行。在大多数其他系统上,它们被杀死而不执行 try...finally 子句或执行对象析构函数。
另一篇文档 (http://docs.python.org/2/library/threading) 中指出:
线程可以被标记为“守护线程”。这个标志的意义是当只剩下守护进程时,整个 Python 程序就会退出。初始值从创建线程继承。
这里只讨论非守护线程。因为第一段引用没有特殊提到非守护线程,所以我认为即使主线程退出,非守护线程也应该被杀死。然而,第二段引用表明情况并非如此。事实上,当主线程退出时,非守护线程确实不会被杀死。那么第一段引用有什么意义呢?

编写代码并尝试运行。 - user2665694
2
似乎thread模块将所有内容都作为守护线程处理,而threading则添加了“非守护”线程的概念。 - Joachim Isaksson
@user2799617:我写了代码并得出结论:“当主线程退出时,非守护线程确实不会被杀死”。这就是为什么我想知道第一个引用语适用的时间,因为我的系统可能是那些“大多数其他系统”之一:运行Python 2.7的Ubuntu 12.10。 - gjain
@JoachimIsaksson:谢谢,这很有道理。我也怀疑是这样,只是需要确认一下。 - gjain
1
@gjain 如果您阅读线程页面的最后部分,将会得到一些有趣的信息,将守护线程与通过线程模块创建的线程相等视。_"这可以通过只在通过线程模块创建的非守护线程中执行导入操作来最轻松地实现。守护线程和直接使用线程模块创建的线程需要某种形式的同步,以确保它们在系统关闭后不会尝试进行导入操作。"_ - Joachim Isaksson
1个回答

13
你所查阅的文档来自于两个不同的模块:threadthreadingthread是一个低级模块,提供了更直接地访问平台中“线程”概念的方式。threading则提供了一个更高层次的“线程”概念,并且与平台相关性较小。
这就是文档中解释差异的原因。低级别的thread“线程”在退出时会受到平台C版本的线程实现影响,但无论如何Python都不会试图对它们进行干净的关闭或不关闭。 threading.Thread则不同。Python正常关闭处理的一部分是.join()所有非守护threading.Thread线程。因此,程序将不会结束,直到所有非守护threading.Thread线程结束(这是程序员的责任)。请注意,低级别的thread模块线程没有.join()的概念 – .join()是由独立的threading模块实现的更高级别的概念。
建议:除非有充分的理由使用thread,否则使用threadingthreading表现更好,并提供了许多有用的工具。使用thread更好的一个例子?我想不出来;-)
注意:在Python 3中,低级别的thread模块更名为_thread。通常,前导下划线提示“最好不要去深入研究这个 – 但如果你必须那就在这里”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接