Я пытаюсь вложить многопроцессорный пул в другой многопроцессорный пул. Оба уровня должны быть пулами процессов, пулы потоков не требуются для моих целей.
Однако все 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