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

При выполнении приведенного ниже кода возникла ошибка. Проблема, похоже, в том, что map не поддерживает функции, принимающие несколько входных данных, как и во встроенном multiprocessing пакете python. Но во встроенном пакете есть 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)

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

"""

Отслеживание (последний вызов последний):

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

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

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

список возврата (карта (* аргументы))

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

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

Файл «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' не определено

"""


person Indominus    schedule 23.01.2019    source источник
comment
Почему бы вам просто не заставить вашу функцию принимать кортеж?   -  person Mad Physicist    schedule 23.01.2019
comment
Или использовать lambda x: b.boo(*x)?   -  person Mad Physicist    schedule 23.01.2019
comment
хм, разве большинство функций не принимают несколько параметров вместо кортежа, как-то уродливо, когда все функции, потенциально параллельные, принимают кортеж. Что касается решения лямбда-выражения, я пробовал, ...pool.map(lambda x: b.boo(*x), ..., это не сработало, кажется, python multipleprocessing вообще не работает с лямбда-выражением   -  person Indominus    schedule 23.01.2019
comment
Как это не сработало? Внутри нет разницы между лямбдой и обычной функцией, поэтому мне трудно в это поверить.   -  person Mad Physicist    schedule 23.01.2019
comment
поверьте мне, я считаю, что вам трудно поверить в это, поскольку раньше мне было трудно в это поверить (или я просто делал это неправильно). Я обновлю, чтобы показать, что я пробовал и как это не сработало.   -  person Indominus    schedule 23.01.2019
comment
Похоже на ошибку определения объема. Авторитетный ответ исправил это.   -  person Mad Physicist    schedule 23.01.2019


Ответы (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>>
>>> 
person Mike McKerns    schedule 23.01.2019
comment
Здорово вот так достать из конской пасти :) - person Mad Physicist; 23.01.2019
comment
Спасибо, что прояснили это! Не могли бы вы подробнее рассказать об этом расширенном starmap, о котором вы упомянули? Я, должно быть, чего-то упускаю, но разве это не p просто встроенный multiprocessing.pool.Pool, почему бы мне не понадобиться пафос, чтобы построить это? - person Indominus; 24.01.2019
comment
Обратите внимание, что это multiprocess, а не _2 _..., это означает, что Pool использует dill, а не pickle для расширенной сериализации. - person Mike McKerns; 24.01.2019
comment
о ... как же плохо! Спасибо! - person Indominus; 24.01.2019