2014-02-14 67 views
0

我想創建一個腳本,它從一個單獨的模塊調用一個函數來執行並​​行處理。多處理:在導入的函數中使用池

我的「頂級」腳本是這樣的:

from hydrology import model, descriptors 
if __name__ == "__main__": 
    datafile = r"C:\folder\datafile.shp" 
    myModel = model.Model(data = datafile) 

    res = descriptors.watershed_pll(myModel) 

descriptors模塊如下所示:

from multiprocessing import Pool 
from arcfunc import multi_watershed 

def watershed_pll(model): 
    pool = Pool() 
    for key, val in model.stations.iteritems(): 
     res = pool.apply_async(multi_watershed(val, key)) 
    pool.close() 
    pool.join() 
    return res 

正如你所看到的,並行運行的功能從進口模塊arcfunc, 執行並行化的功能位於模塊descriptors內部,並且運行所有內容的腳本再次分離。

有沒有例外,當我跑,但我有兩個問題:

  1. res.successful()返回false
  2. 它運行快沒有比沒有多處理。

我懷疑我的架構是複雜的事情,但是,重要的是並行化功能是在一個單獨的模塊。

有什麼建議嗎?

回答

0

代碼將函數和參數傳遞給apply_async,代碼直接(在主進程中)調用multi_watershed,並傳遞該函數的返回值。

傳遞函數和參數。

替換以下行:

res = pool.apply_async(multi_watershed(val, key)) 

有:

res = pool.apply_async(multi_watershed, (val, key)) 
+0

咄!謝謝。那麼,它的工作,但我仍然有問題,它不會更快。這可能與外部庫的使用有關:arcpy .... – jramm

+0

@jramm,對不起,但我不知道arcpy。 – falsetru