Есть ли у pathos.multiprocessing starmap?

Я получил ошибку при выполнении кода ниже. Проблема, кажется, map не поддерживает функции, принимающие несколько входов, как во встроенном Python multiprocessing пакет. Но во встроенном пакете есть starmap это решает эту проблему. Есть ли pathos.multiprocessing имеют те же?

import pathos.multiprocessing as mp


class Bar:
    def foo(self, name):
        return len(str(name))

    def boo(self, x, y, z):
        sum = self.foo(x)
        sum += self.foo(y)
        sum += self.foo(z)
        return sum


if __name__ == '__main__':
    b = Bar()
    pool = mp.ProcessingPool()
    results = pool.map(b.boo, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
    print(results)

Ошибка типа: boo () отсутствует 2 обязательных позиционных аргумента: 'y' и 'z'

Обновление лямбда-выражения, как предложено (не работает):

if __name__ == '__main__':
    b = Bar()
    pool = mp.ProcessingPool()
    results = pool.map(lambda x: b.boo(*x), [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
    print(results)

multiprocess.pool.RemoteTraceback:

"""

Traceback (последний вызов был последним):

Файл "C:\Users\yg451\Anaconda3\lib\site-packages\multiprocess\pool.py", строка 121, в рабочем

результат = (True, func(*args, **kwds))

Файл "C:\Users\yg451\Anaconda3\lib\site-packages\multiprocess\pool.py", строка 44, в mapstar

список возврата (карта (*args))

Файл "C:\Users\yg451\Anaconda3\lib\site-packages\pathos\helpers\mp_helper.py", строка 15, в

func = лямбда-аргументы: f(*args)

Файл "C:/Users/yg451/Code/foo/Machine Learning/xPype/test/scratch.py", строка 18, в

results = pool.map(лямбда-x: b.boo (* x), [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])

NameError: имя 'b' не определено

"""

1 ответ

Решение

Я pathos автор. pathos старше чем starmapи на самом деле это не нужно. Он решал несколько аргументов в пуле точно так же, как встроенный map делает.

>>> import pathos.multiprocessing as mp
>>> class Bar:
...     def foo(self, name):
...         return len(str(name))
...     def boo(self, x, y, z):
...         sum = self.foo(x)
...         sum += self.foo(y)
...         sum += self.foo(z)
...         return sum
... 
>>> b = Bar()
>>> pool = mp.ProcessingPool()
>>> f = lambda x: b.boo(*x)    
>>> results = pool.map(f, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
>>> results 
[6, 4, 5]
>>> results = pool.map(b.boo, [12, 9, 'a'], [3, 9, 'b'], [456, 10, 'cde'])
>>> results
[6, 4, 5]
>>> results = map(b.boo, [12, 9, 'a'], [3, 9, 'b'], [456, 10, 'cde'])
>>> list(results)
[6, 4, 5]
>>> 

Итак, по сути, starmap не нужно Однако, как это было недавно добавлено к стандарту Pool интерфейс в multiprocessing в некоторых версиях Python он, вероятно, должен быть более заметным в pathos, Обратите внимание, что уже возможно получить "расширенную" версию starmap от pathos если хочешь.

>>> import pathos
>>> mp = pathos.helpers.mp
>>> p = mp.Pool()
>>> p.starmap
<bound method Pool.starmap of <multiprocess.pool.Pool object at 0x1038684e0>>
>>> 
Другие вопросы по тегам