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

时间:2018-06-10 15:15:27

标签: python python-multiprocessing

使用python 3.6,我遇到了这样的问题:(1)在一个令人尴尬的并行作业上有一个joblib.Parallel循环(2)作业本身是相当耗时的c ++本机对象,偶尔会出现段错误,而且我的代码不能修改

为了防止段错误,我试图将作业本身包装在多处理过程中。不幸的是,python本身会使用此解决方案向daemonic processes are not allowed to have children引发断言错误。

所以我在此处发布了解决方案并尝试继承Process: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)

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

有更好的方法吗?我很感激任何帮助,使其更加强大和可靠。

1 个答案:

答案 0 :(得分:-1)

保持简单,愚蠢:)

您的错误消息位于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__'块中的必要逻辑。

要从子进程获取结果,请以任何机器可读格式将其打印到stdout,或使用任何IPC机制。