Skip to main content
 首页 » 编程设计

python之从python多处理进程中删除守护进程

2025年05月04日9duanxz

使用 python 3.6,我遇到这样的问题:(1) 有一个 joblib.Parallel 循环遍历令人尴尬的并行作业 (2) 作业本身是相当耗时的 c++ native 对象,偶尔会出现段错误我无法修改其代码。

为了防止段错误,我试图将作业本身包装在一个多处理进程中。不幸的是,对于此解决方案,python 本身会抛出一个断言错误,daemonic processes are not allowed to have children。

所以我采用了此处发布的解决方案并尝试从进程继承:https://stackoverflow.com/a/8963618/614684

那也不管用,所以我想出了以下确实有效的解决方案:

class NoDaemonProcess(multiprocessing.Process): 
  def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, 
               *, daemon=None): 
    super(NoDaemonProcess, self).__init__(group, target, name, args, kwargs, daemon=daemon) 
    if 'daemon' in multiprocessing.process._current_process._config: 
      del multiprocessing.process._current_process._config['daemon'] 
    self._config = multiprocessing.process._current_process._config.copy() 
  # make 'daemon' attribute always return False                                                                                                                                               
  def _get_daemon(self): 
    return False 
  def _set_daemon(self, value): 
    pass 
  daemon = property(_get_daemon, _set_daemon) 

基本上,我修改了 multiprocessing 包的全局状态以删除当前进程是守护进程这一事实。

有更好的方法吗?我将不胜感激任何帮助,使它更加健壮和可靠。

请您参考如下方法:

保持简单,愚蠢 :)

您的错误消息位于 https://github.com/python/cpython/blob/master/Lib/multiprocessing/process.py#L110 .

您可以使用常规 subprocess 作为您的工作负载的一部分。它不受任何multiprocessing的约束。逻辑。为避免专门为此创建单独的 Python 程序,只需执行

subprocess.Popen([sys.executable,__file__,"<arg>"]) 

并制作<arg>在 if __name__ == '__main__' 中触发必要的逻辑 block 。

要从子进程中获取结果,要么以任何机器可读的格式将其打印到标准输出,要么使用任何 IPC 机制。