Вложенный пул многопроцессорной обработки в Python с использованием Pathos / Multiprocessing - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь вложить многопроцессорный пул в другой многопроцессорный пул. Оба уровня должны быть пулами процессов, пулы потоков не требуются для моих целей.

Однако все 5 моих попыток с использованием multiprocssing или 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: daemoni c процессам не разрешено иметь детей


Попытка № 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: daemoni c процессам не разрешено иметь детей


Попытка # 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 Пул процессов, не являющийся демоном c?

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 Пул процессов не -daemoni c?

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):

Ошибка типа: метод ex Получил 2 аргумента, получил 3

Любые советы по созданию многопроцессорного пула, вложенного в многопроцессорный пул, очень приветствуются! Использование pathos - это , не требуется , хотя pathos, похоже, уже поддерживает вложенные / иерархические многопроцессорные карты, поэтому я считаю, что это более простое решение, чем встроенный в Python 3 модуль multiprocessing.

Использование Python 3.8.0 и пафоса 0.2.5 на Ma c OS X Catalina 10.15.2

...