11

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

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

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

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。初始值继承自创建线程。

让我们在这里只讨论非守护线程。由于第一个引号没有对非守护线程进行任何特殊引用,因此我假设如果主线程正在退出,即使是非守护线程也应该被杀死。但是,第二个引用表明并非如此。而事实上,当主线程退出时,非守护线程确实没有被杀死。那么,这里的第一句话有什么意义呢?

4

1 回答 1

11

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

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

Athreading.Thread不同。Python 的正常关闭处理的一部分是针对.join()所有非守护threading.Thread线程的。因此,在所有非守护threading.Thread线程都结束之前,程序根本不会结束(这是程序员的责任确保)。请注意,低级thread模块线程没有.join()-的概念,它是distinct模块.join()实现的高级概念。threading

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

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

于 2013-10-06T17:50:50.940 回答