use*_*829 13 python pool multiprocessing pathos
我正在尝试使用Python的pathos将计算指定到单独的进程中,以便使用多核处理器加速它.我的代码组织如下:
class:
def foo(self,name):
...
setattr(self,name,something)
...
def boo(self):
for name in list:
self.foo(name)
Run Code Online (Sandbox Code Playgroud)
由于我在multiprocessing.Pool中遇到酸洗问题,我决定尝试使用pathos.我尝试过,如前几个主题中所述:
import pathos.multiprocessing
Run Code Online (Sandbox Code Playgroud)
但它导致错误:没有模块多处理 - 我在最新的病毒版本中找不到.
然后我尝试修改boo方法:
def boo(self):
import pathos
pathos.pp_map.pp_map(self.foo,list)
Run Code Online (Sandbox Code Playgroud)
现在没有抛出错误,但是foo不起作用 - 我的类的实例没有新的属性.请帮助我,因为在花了一天之后,我不知道接下来要去哪里.
Mik*_*rns 28
我是pathos作者.我不确定你要从上面的代码中做什么.不过,我可以说清楚一点.这是一些类似的代码:
>>> from pathos.multiprocessing import ProcessingPool
>>> class Bar:
... def foo(self, name):
... return len(str(name))
... def boo(self, things):
... for thing in things:
... self.sum += self.foo(thing)
... return self.sum
... sum = 0
...
>>> b = Bar()
>>> results = ProcessingPool().map(b.boo, [[12,3,456],[8,9,10],['a','b','cde']])
>>> results
[6, 4, 5]
>>> b.sum
0
Run Code Online (Sandbox Code Playgroud)
所以上面发生的是,实例的boo方法被调用,其中传递给新的python进程,然后为每个嵌套列表进行评估.你可以看到结果是正确的...... len("12")+ len("3")+ len("456")是6,依此类推.Barbb.boo
但是,你也可以看到,当你看b.sum,它仍然是神秘的0.为什么b.sum还是零?那么,什么multiprocessing(因此也pathos.multiprocessing)做,是做一个COPY不管你通过映射到其他Python过程......然后复制的实例,然后调用(平行),并返回任何结果被调用的方法叫的.请注意,您必须返回结果,或打印它们,或记录它们,或将它们发送到文件或其他方式.它们无法像您期望的那样返回到原始实例,因为它不是发送到其他处理器的原始实例.创建实例的副本,然后将其处理掉 - 每个实例的sum属性都增加了,但原始的`b.sum'没有被触及.
然而有,计划内pathos做出类似上面的工作正如您所料-在原来的对象IS更新,但它不喜欢的工作呢.
编辑:如果您正在安装pip,请注意最新发布的版本已有pathos几年的历史,可能无法正确安装,或者可能无法安装所有子模块.一个新的pathos版本正在等待,但在那之前,最好从github获取最新版本的代码,并从那里安装.主干大部分在开发中稳定.我认为您的问题可能是由于安装中存在"新" pip- "旧" pathos不兼容性而未安装所有软件包.如果pathos.multiprocessing缺少,这是最可能的罪魁祸首.
pathos从这里获取github:https://github.com/uqfoundation/pathos