2014-09-26 39 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