[英]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.