【问题标题】:Are daemon threads killed when main thread calls sys.exit()?当主线程调用 sys.exit() 时,守护线程是否被杀死?
【发布时间】:2019-02-01 08:39:26
【问题描述】:

根据文档:https://docs.python.org/3/library/threading.html

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。初始值继承自创建线程。该标志可以通过 daemon 属性或 daemon 构造函数参数设置。

示例代码:

thread = threading.Thread(target=MultiHandler().network, args=(conn, data), daemon=True)
thread.start()

参考许多其他 StackOverflow 答案,我不清楚当主线程调用 sys.exit() 时是否强制关闭守护线程

【问题讨论】:

  • 当一个程序退出时,它的所有子线程都会被杀死。非守护进程的线程会阻止程序退出,从而防止它们自己的破坏。
  • @zwer 在这种情况下,如果我的线程是非守护进程,我是否仍然需要调用join() 来等待线程,然后再调用sys.exit()
  • 你没有,但是你失去了对程序退出的控制。如果你不管理优雅的退出,你最终会得到你的主线程finishing,然后挂在那里等待其他线程完成而无法启动。
  • sys.exit() 的文档对多线程程序不太清楚,但如果仔细观察,您会发现它说sys.exit() 除了抛出异常之外什么都不做。因此,它只会终止调用它的一个线程,并且只有当该线程没有处理程序来吞下异常时。

标签: python python-3.x multithreading


【解决方案1】:

参考zwer发表的评论,

当一个程序退出时,它的所有子线程都会随之终止。非守护线程将阻止程序退出,从而防止它们自身的破坏。 - zwer

简而言之,是的,守护线程不会阻止程序退出,因此它们会在退出时被杀死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2013-10-13
    相关资源
    最近更新 更多