使用 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 机制。
