2014-10-31 88 views
0

我想了解Python多處理模塊。下面的代碼創建4個進程並嘗試運行功能f(x)Python多處理得到結果

問題

  1. 我創建4個過程,但提交多個任務(F,[10])。模塊會在任何時候自動運行每4個進程嗎?
  2. 我將結果捕獲到列表中。 pool.apply_async將會返回什麼結果,它會是作業中的打印語句還是方法返回的內容?

當我執行此代碼時,它只顯示100,但不顯示其他值。

from multiprocessing import Pool 

def f(x): 

    print x*x 
    return x*x 


if __name__ == '__main__': 

    result = [] 
    pool = Pool(processes=4)    
    result.append(pool.apply_async(f, [10])) 
    out = map(lambda x: x.get(), result) 
+0

所有的問題都在文檔中得到解答:https://docs.python.org/2/library/multiprocessing.html – Wolph 2014-10-31 15:24:56

回答

1

您創建的池有4個可用的進程。然後,你可以給它一個單一的工作,並將其分配給其4個工作人員中的一個。如果你給它更多的工作,它會使用更多的工人。

+0

所以,在我的情況下......我給了10個工作......這是否意味着它將同時創建10個進程或將運行4個進程並再次創建另外4個進程。 – user1050619 2014-10-31 15:38:19

+0

您可以在構造函數中定義池中可用的工作器的數量。該池有一個內部隊列,當您通過apply_async爲其提供作業時,它會將這些作業放入隊列中。工作進程然後從隊列中選擇作業(異步)。所以如果你給它10個工作,那麼所有4個工人應該很忙,直到工作隊列被清空。 – 2014-10-31 15:50:18

1

實際上你只在這裏提交一個任務:函數f帶有參數元組(10,),這意味着你只是在一個worker中執行f(10)。如果您實際提交了4個以上的進程,則Pool將始終同時執行至多4個任務。只要一個任務完成,一個待處理任務將開始替換它,直到沒有剩餘的任務。還要注意,整個過程將使用相同的四個過程;它們在完成任務後不會重新啓動,除非在創建Pool時提供maxtasksperchild關鍵字參數。

apply_async將返回一個AsyncResult對象,該對象可用於在任務可用時獲取任務結果。您通過在AsyncResult對象上調用get()來完成此操作,因此out列表將包含您的一個呼叫的返回值f。工作進程中的東西print將出現在標準輸出中,就像它在主進程中運行它一樣,但不會在任何地方捕獲。