python - 使用 Pathos/Multiprocessing 在 Python 中嵌套多处理池
问题描述
我正在尝试将多处理池嵌套在另一个多处理池中。两个级别都需要是进程池,我的目的不需要线程池。
但是,我使用multiprocssing
or的所有 5 次尝试pathos
都失败了
尝试#1:
from multiprocessing import Pool
def foo(a, b):
return Pool(3).map(bar, range(a+b))
def bar(x):
return Pool(3).map(baz, range(x*2))
def baz(z):
return z**2
if __name__ == '__main__':
results = Pool(3).starmap(foo, list(zip(range(0,10,2), range(1,10,2))))
print(results)
给出了错误
AssertionError: 守护进程不允许有子进程
尝试#2:
from pathos.multiprocessing import ProcessPool
def foo(a, b):
return ProcessPool(3).map(bar, range(a+b))
def bar(x):
return ProcessPool(3).map(baz, range(x*2))
def baz(z):
return z**2
if __name__ == '__main__':
results = ProcessPool(3).map(foo, range(0,10,2), range(1,10,2))
print(results)
给出了错误
AssertionError: 守护进程不允许有子进程
尝试#3:
from pathos.parallel import ParallelPool
def foo(a, b):
return ParallelPool(nodes=3).map(bar, range(a+b))
def bar(x):
return ParallelPool(nodes=3).map(baz, range(x*2))
def baz(z):
return z**2
if __name__ == '__main__':
results = ParallelPool(nodes=3).map(foo, range(0,10,2), range(1,10,2))
print(results)
给出了错误
NameError:未定义名称“AbstractWorkerPool”
尝试#4:
import multiprocessing
class NonDaemonPool(multiprocessing.Pool):
def Process(self, *args, **kwds):
proc = super(NonDaemonPool, self).Process(*args, **kwds)
class NonDaemonProcess(proc.__class__):
"""Monkey-patch process to ensure it is never daemonized"""
@property
def daemon(self):
return False
@daemon.setter
def daemon(self, val):
pass
proc.__class__ = NonDaemonProcess
return proc
def foo(a, b):
return NoDaemonPool(3).map(bar, range(a+b))
def bar(x):
return NoDaemonPool(3).map(baz, range(x*2))
def baz(z):
return z**2
if __name__ == '__main__':
results = NoDaemonPool(3).starmap(foo, list(zip(range(0,10,2), range(1,10,2))))
print(results)
给出了错误
class NonDaemonPool(multiprocessing.Pool):
TypeError:方法预期 2 个参数,得到 3 个
尝试#5:
import multiprocessing
class NoDaemonProcess(multiprocessing.Process):
@property
def daemon(self):
return False
@daemon.setter
def daemon(self, value):
pass
class NoDaemonContext(type(multiprocessing.get_context())):
Process = NoDaemonProcess
class NonDaemonPool(multiprocessing.Pool):
def __init__(self, *args, **kwargs):
kwargs['context'] = NoDaemonContext()
super(NonDaemonPool, self).__init__(*args, **kwargs)
def foo(a, b):
return NoDaemonPool(3).map(bar, range(a+b))
def bar(x):
return NoDaemonPool(3).map(baz, range(x*2))
def baz(z):
return z**2
if __name__ == '__main__':
results = NoDaemonPool(3).starmap(foo, list(zip(range(0,10,2), range(1,10,2))))
print(results)
给出了错误
class NonDaemonPool(multiprocessing.Pool):
TypeError:方法预期 2 个参数,得到 3 个
非常感谢任何实现嵌套在多处理池中的多处理池的建议!虽然似乎已经支持嵌套/分层多处理映射,但不需要使用 of ,所以我相信它pathos
是比 Python 3 的内置模块更简单的解决方案。pathos
multiprocessing
在 Mac OS X Catalina 10.15.2 上使用 Python 3.8.0 和 pathos 0.2.5
解决方案
推荐阅读
- google-chrome - 如何通过javascript在谷歌输入字段中设置和获取值
- email - MJML 布局在 Outlook 客户端中非常错误,但在其他客户端中还可以
- javascript - javascript中的'var'没有存储值
- r - 使用 Dplyr 合并两个数据集
- python - 如何在循环中使用 for in 和 if 语句
- php - 我可以在 PHP 中将对象声明为类中的数据成员吗?
- php - 从 0 到 1 的错误报告使我的 Web 应用程序崩溃
- python - 错误:迁移依赖项引用不存在的父节点
- docker - docker-compose for orthanc
- bash - 从 CI 推送到存储库