使用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)
基本上,我修改了多处理包的全局状态,以删除当前进程是守护进程的事实。
有更好的方法吗?我很感激任何帮助,使其更加强大和可靠。
答案 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机制。