Python 3.x pathos.multiprocessing有星图吗?
我在执行下面的代码时出错。问题似乎在于map不支持接受多个输入的函数,就像python内置的多处理包一样。但是在内置的包中,有一个星图可以解决这个问题。pathos.multiprocessing有相同的功能吗Python 3.x pathos.multiprocessing有星图吗?,python-3.x,multiprocessing,pathos,Python 3.x,Multiprocessing,Pathos,我在执行下面的代码时出错。问题似乎在于map不支持接受多个输入的函数,就像python内置的多处理包一样。但是在内置的包中,有一个星图可以解决这个问题。pathos.multiprocessing有相同的功能吗 import pathos.multiprocessing as mp class Bar: def foo(self, name): return len(str(name)) def boo(self, x, y, z): sum
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表达式更新无效:
multiprocess.pool.RemoteTraceback:
回溯最近一次呼叫上次:
文件
C:\Users\yg451\Anaconda3\lib\site packages\multiprocess\pool.py,
第121行,输入
结果=真,函数*参数,**kwds
文件
C:\Users\yg451\Anaconda3\lib\site packages\multiprocess\pool.py,
第44行,地图之星
返回listmap*参数
文件
C:\Users\yg451\Anaconda3\lib\site packages\pathos\helpers\mp\u helper.py,
第15行,在
func=lambda参数:f*args
文件C:/Users/yg451/Code/foo/Machine
学习/xPype/test/scratch.py,第18行,输入
结果=pool.maplambda x:b.boo*x,[12,3456,8,9,10,'a','b','cde']
名称错误:未定义名称“b”
我是《悲情》的作者。pathos比星图更古老,并不真正需要它。它以与内置映射完全相同的方式解决池中的多个参数
因此,基本上,星图是不必要的。但是,由于最近在某些版本的python中,它被添加到了多处理的标准池接口中,因此它在pathos中可能会更突出。请注意,如果您愿意,可以从pathos获得星图的增强版
>>> import pathos
>>> mp = pathos.helpers.mp
>>> p = mp.Pool()
>>> p.starmap
<bound method Pool.starmap of <multiprocess.pool.Pool object at 0x1038684e0>>
>>>
为什么不让你的函数接受一个元组呢?或者使用lambda x:b.boo*x?嗯,大多数函数不是接受多个参数而不是元组吗?让所有可能并行的函数都接受一个元组有点难看。对于lambda表达式解决方案,我尝试了,…pool.maplambda x:b.boo*x,…,它不起作用,似乎python多重处理在lambda表达式上根本不起作用它怎么不起作用?在内部,lambda和正则函数之间没有区别,所以我很难相信。相信我,我相信你很难相信,就像我过去很难相信那样,或者我只是做错了。我将更新,以显示我尝试了什么,以及它是如何不起作用的。从马口中得到它真是太棒了:谢谢你澄清了这一点!你能详细说明一下你提到的这张增强星图吗?我一定是遗漏了什么,但这p不就是内置的multiprocessing.pool.pool吗,为什么我不需要pathos来构建它呢?注意,它是多进程的,而不是多进程的。。。这表明池使用dill而不是pickle进行高级序列化。哦…,我的错!非常感谢。
>>> 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]
>>>
>>> import pathos
>>> mp = pathos.helpers.mp
>>> p = mp.Pool()
>>> p.starmap
<bound method Pool.starmap of <multiprocess.pool.Pool object at 0x1038684e0>>
>>>