【问题标题】:What happens to other threads when main thread calls sys.exit()?当主线程调用 sys.exit() 时,其他线程会发生什么?
【发布时间】:2013-10-13 01:42:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: python multithreading python-2.7 daemon exit


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多