繁体   English   中英

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

[英]Removing daemon from python multiprocessing process

使用python 3.6,我有一个类似这样的问题:(1)在尴尬的并行作业上有一个joblib.Parallel循环(2)作业本身是相当耗时的c ++本机对象,有时会出现段错误,并且我无法修改其代码。

为了防止出现段错误,我尝试将作业本身包装在多处理流程中。 不幸的是,python本身引发了带有daemonic processes are not allowed to have children的断言错误,该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)

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

有一个更好的方法吗? 我将不胜感激,这将使它变得更加强大和可靠。

保持简单,愚蠢:)

您的错误消息在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机制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM