pathos.multiprocessing是否有星图?

时间:2019-01-23 09:42:44

标签: python-3.x multiprocessing pathos

执行以下代码时出现错误。问题似乎是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”

根据建议更新lambda表达式(无效):

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行,在工作程序中

     

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

     

文件   “ C:\ Users \ yg451 \ Anaconda3 \ lib \ site-packages \ multiprocess \ pool.py”,   Mapstar中的第44行

     

返回列表(map(* args))

     

文件   “ C:\ Users \ yg451 \ Anaconda3 \ lib \ site-packages \ pathos \ helpers \ mp_helper.py”,   

中的第15行      

func = lambda args:f(* args)

     

文件“ C:/ Users / yg451 / Code / foo / Machine   

中的第18行中的Learning / xPype / test / scratch.py​​”      

结果= pool.map(lambda x:b.boo(* x),[(12,3,456),(8,9,10),('a','b','cde') ])

     

NameError:名称'b'未定义

     

“”“

1 个答案:

答案 0 :(得分:2)

我是pathos的作者。 pathosstarmap年长,因此并不需要它。它以与内置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是不必要的。但是,由于它是最近在某些版本的python中添加到Pool中的标准multiprocessing接口中的,因此它在pathos中可能应该更加突出。请注意,如果您愿意,可以从starmappathos的“增强版”。

>>> import pathos
>>> mp = pathos.helpers.mp
>>> p = mp.Pool()
>>> p.starmap
<bound method Pool.starmap of <multiprocess.pool.Pool object at 0x1038684e0>>
>>>