首页 > 解决方案 > 使用 Pathos/Multiprocessing 在 Python 中嵌套多处理池

问题描述

我正在尝试将多处理池嵌套在另一个多处理池中。两个级别都需要是进程池,我的目的不需要线程池。

但是,我使用multiprocssingor的所有 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:

基于Python 进程池非守护进程?

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:

基于Python 进程池非守护进程?

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 的内置模块更简单的解决方案。pathosmultiprocessing

在 Mac OS X Catalina 10.15.2 上使用 Python 3.8.0 和 pathos 0.2.5

标签: pythonpython-3.xparallel-processingmultiprocessingpathos

解决方案


推荐阅读