2014-09-26 19 views
8

我试图使用Python的凄美指定计算成独立的进程,以便与多核处理器来加速它。我的代码是这样组织的:Python的多悲切

class: 
    def foo(self,name): 
    ... 
    setattr(self,name,something) 
    ... 
    def boo(self): 
     for name in list: 
     self.foo(name) 

由于酸洗问题与多处理.Pool,我决定尝试病态。 我试过了,建议在前面的主题:

import pathos.multiprocessing 

,但它导致错误:没有模块多 - 我无法找到最新的悲怆版本。

然后我试图修改嘘声方法:

def boo(self): 
import pathos 
pathos.pp_map.pp_map(self.foo,list) 

现在还没有抛出错误,但富不工作 - 我的类的实例没有新的属性。请帮助我,因为在花了一天的时间后,我不知道下一步该怎么做。

回答

17

我是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 

所以上面发生了什么,是哪里b.boo传递到一个新的Python程序,然后评估每个嵌套列表的Bar实例bboo方法被调用。你可以看到结果是正确的... len(“12”)+ len(“3”)+ len(“456”)是6,依此类推。

但是,您也可以看到,当您看到b.sum时,它仍然是神秘的0。为什么b.sum仍然为零?那么,什么multiprocessing(因此也pathos.multiprocessing)不,是做一个COPY无论你通过映射到其他Python过程......然后复制的实例,然后调用(平行)的并返回任何结果被称为该方法被调用。注意,你必须RETURN结果,或者打印出来,或者记录它们,或者将它们发送到一个文件,或以其他方式。他们无法像您期望的那样回到原始实例,因为它不是原始实例发送到其他处理器。实例的副本创建,然后设置的 - 他们每个人有自己的sum属性增加,但原来`b.sum”是不变。

然而,有计划在pathos做出类似上述工作,你可能会预期 - 原始对象IS更新,但它不起作用。

编辑:如果您正在使用pip安装,注意,pathos最新发布的版本是几年前的,并且可能无法正确安装,或可能无法安装所有子模块。一个新的pathos正在等待发布,但在此之前,最好从github获取最新版本的代码,然后从那里安装。发展中的大部分行李箱是稳定的。我觉得你的问题可能是,并非所有的包都安装了,由于“新” pip - “老” pathos在安装不兼容。如果缺少pathos.multiprocessing,这是最可能的罪魁祸首。

获取pathos从GitHub这里:https://github.com/uqfoundation/pathos

+0

我有同样的问题,因为这里OP。我可以做'import pathos',但'import pathos.multiprocessing'给了我一个找不到模块的错误。这可能是什么原因? – sashkello 2014-11-04 22:33:39

+0

问题是,我不明白OP的问题......由于英文中的一些障碍以及最小代码示例。也许我可以尝试另一种方法。也许所有的依赖关系都没有安装。你可以'进口加工'?如何从'processing.pool导入池'?如何从'pathos.helpers导入mp_helper'或'从pathos.helpers导入ProcessPool'?怎么样'进口pp'和'从pathos.helpers导入pp_helper'? – 2014-11-05 01:06:15

+0

'from pathos.helpers import *'给出“No module named helpers”。不知何故,不是所有的悲伤都可以用于我,它似乎OP。我从pip安装它,它是最新版本。 – sashkello 2014-11-05 02:09:41