Есть ли у pathos.multiprocessing starmap? - PullRequest
0 голосов
/ 23 января 2019

Я получил ошибку при выполнении кода ниже. Кажется, проблема в том, что 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)

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:

"" "

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

Файл "C: \ Users \ yg451 \ Anaconda3 \ Lib \ сайт-пакеты \ нескольких процессов \ pool.py", линия 121, в рабочем

result = (True, func (* args, ** kwds))

Файл "C: \ Users \ yg451 \ Anaconda3 \ Lib \ сайт-пакеты \ нескольких процессов \ pool.py", линия 44, в mapstar

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

Файл "C: \ Users \ yg451 \ Anaconda3 \ Lib \ сайт-пакеты \ пафоса \ хелперы \ 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 Ответ

0 голосов
/ 23 января 2019

Я 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>>
>>> 
...