【发布时间】:2018-06-10 15:15:27
【问题描述】:
使用 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)
基本上,我修改了多处理包的全局状态,以删除当前进程是守护进程这一事实。
有没有更好的方法来做到这一点?我将不胜感激任何有助于使其更强大和可靠的帮助。
【问题讨论】:
-
他们必须是恶魔吗?现在它们的行为就像正常的流程一样。
-
@MegaIng
multiprocessing.Pool为工人设置守护进程标志:github.com/python/cpython/blob/master/Lib/multiprocessing/…
标签: python python-multiprocessing