为什么我们必须在Python中的非守护进程上使用join方法

时间:2018-10-14 05:31:24

标签: python multithreading multiprocessing

根据守护程序线程/进程的定义,它们不会阻止主线程/进程退出,而主线程/进程只有在其非守护程序线程退出后才会退出。

如果是这种情况,为什么我们要关心在线程/进程上调用threading.join()方法或multiprocessing.join()方法。

我不确定我对线程和进程的假设是否为write。如果不是,请指出正确的方向。

谢谢您的回答。

1 个答案:

答案 0 :(得分:0)

来自multiprocessing Programming Guidelines

  

加入僵尸进程

     

在Unix上,当进程完成但尚未加入时,它将成为僵尸。永远不要有太多,因为每次启动新进程(或调用active_children()时),所有尚未加入的已完成过程都将加入。同时调用已完成流程的Process.is_alive将加入该流程。即便如此,将您启动的所有进程明确加入也可能是一个好习惯。

UNIX操作系统要求将过期的进程明确地“垃圾回收”。忽略它会导致与不关闭文件时类似的问题。您将慢慢泄漏空的进程表,直到没有可用的进程表,并且您的应用程序将崩溃。

不幸的是,multiprocessing模块旨在重现threading API,因此使用的有时是令人困惑的相同术语。 UNIX中的multiprocessing.Process.join与低级C wait函数相似。

如果您不想阻塞等待进程到期,则可以通过将join的超时时间设置为0或使用multiprocessing.active_children API来定期轮询已到期的进程。无论如何,通常都将daemon标志设置为True