加入一个守护线程

5

我在阅读有关守护线程的内容时,看到了这个SO页面,并且在答案下面的评论中看到了以下内容:

但加入一个被守护线程的调用很可能会带来很多麻烦!我现在正在考虑从我的小图中删除对守护线程的join()调用。

我理解了守护线程的用途和原因,但是假设您必须等待守护线程完成其工作,如果调用join()被认为会带来很多麻烦,那么您该如何做呢?

1个回答

9
如果您想能够使用.join合并线程,最好不要将其设置为守护线程。守护线程适用于当您希望线程执行自己的操作且并不关心其何时完成或是否完成时。
创建守护线程的目的在于,当没有非守护线程存活时,程序会退出。
根据线程文档
线程可以被标记为“守护线程”。该标志的意义在于,只有守护线程存活时,整个Python程序才会退出。初始值继承自创建线程。此标志可通过守护进程属性或守护进程构造函数参数进行设置。
您实际上可以在守护线程上调用.join,但通常认为这不是一个好做法。
在守护线程完成之前,您可以让其设置一个Event,然后让一个或多个其他线程检查它,但更简单的方法是使用非守护线程并对其进行.join
此前版本的答案声称您不能.join守护线程。这是错误的。我搞混了虚拟线程。对此感到抱歉 :oops:

1
@SvetlanaRosemond 等待守护线程可能有些奇怪。这里有一个良好的解释:多线程 - 守护线程和 join 方法 - PM 2Ring
1
@PirateApp 抱歉,我不了解Redis。 - PM 2Ring
守护线程不会导致主程序线程等待输出。同样,非守护线程也不会导致主程序线程等待输出。但是如果主程序使用.join,两者都会使主程序等待。那么守护线程的用例究竟是什么呢? - variable
@变量 在前两段中说的话。当您希望程序能够退出但仍有一些守护线程存活时,请使用守护线程。对于非守护线程,您需要某种方法来要求这些线程完成。 - PM 2Ring
@variable 因为如果你不这样做,它们可能会永远运行下去。主线程无法强制其他线程停止。如果您对此主题有更多问题,请提出适当的问题。注释不适合进行此类对话。 - PM 2Ring
显示剩余9条评论

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