2017-08-29 108 views
2

這是一個非常簡單的我正在使用的更復雜的代碼版本。問題是我想將方法​​()函數中計算的項追加到稍後可以顯示的某個列表中。但是,運行此代碼時,列表對象爲空,而結果數組已滿。如何在並行進程(python)中追加項目到列表?

import multiprocessing as mp 
    global list 
    list = [] 
    def add(thing): 
     list.append(thing) 
    def method(): 
     global list 
     add(8) #doesn't work as wanted 
     return 7 
    def logResult(result): 
     results.append(result) 

    if (__name__ == '__main__'): 
     results = [] 
     cpu = mp.cpu_count() 
     pool = mp.Pool(processes=cpu) 
     for x in range(0, 2000): 
      pool.apply_async(method,callback=logResult) 
     pool.close() 
     pool.join() 
     print list 
     print results 

輸出:

[] 
    [7,7,7,7,7,7,7,7,7....] and so on. 

我知道add方法似乎是多餘的,但一個簡單的list.append()方法()函數中也不起作用。 add方法是爲了鏡像logResult方法()。我可以看到它爲什麼不起作用,但我不知道如何解決這個問題。如果沒有並行化,程序會按照需要運行,但是我的項目需要並行化,因爲完成的計算比method()函數要冗長得多。期望的輸出將是

[8,8,8,8,8,8,8,8,8,8,8,8,...] 
    [7,7,7,7,7,7,7,7,7,7,7,7,...] and so on. 

在此先感謝。

+1

全局變量不能在python進程間共享。最簡單的解決方案是從'method'返回7和8,然後將8收集到列表中。請參閱'Pool.map'。 –

回答

0

看來你已經在method()中設置了global list這是空的。如果你之前已經設置過,它不需要在方法()中。

0
pool.apply_async(method,callback=logResult) 
  1. 你的方法和功能缺失()。
  2. logResult應該有話要傳遞(根據您的代碼)

簡單地改變這樣的:

pool.apply_async(method(),callback=logResult(7)) 

GET結果[8,8,8,8,8 ...] ,[7,7,7,7,7 ...]

相關問題