2016-07-28 42 views
0

這是我的代碼:Python的多重apply_async僅使用一個過程

import multiprocessing 
import time 
import os 

def worker(): 
    print str(os.getpid()) + " is going to sleep..." 
    time.sleep(1) 
    print str(os.getpid()) + " woke up!" 
    return 

if __name__ == "__main__": 
    pool = multiprocessing.Pool(processes = 8) 
    for _ in range(5): 
     pool.apply_async(worker()) 

而且我的輸出:

23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 

這個輸出依次出現明顯的所有輸出具有相同的ID。我期望看到的是5個獨立的進程,提醒他們要睡覺,然後在相似的時間醒來。

爲什麼這不會發生?我已經對stackoverflow和其他網站進行了大量的研究,似乎每個人都確信,這應該讓「工作人員」可以在多個進程中應用,但似乎並非如此。

+0

應該是:'apply_asynch(worker)'''不帶'()'。 – Bakuriu

回答

2

您是調用worker功能,所以當前進程執行的worker的結果(即None)傳遞給apply_asynch它什麼也不做的代碼和然後

以這種方式將其更改爲pool.apply_asynch(worker)函數worker被傳遞給執行它的子進程。


是死清楚,問題是這樣的區別:

>>> def worker(): 
...  print('Hi there!') 
... 
>>> def f(func): 
...  print('Received', func) 
...  func() 
... 
>>> f(worker()) 
Hi there! 
Received None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in f 
TypeError: 'NoneType' object is not callable 

而且這樣的:

>>> f(worker) 
Received <function worker at 0x7f5cd546f048> 
Hi there! 

注意,前者線的錯貨,產生TypeError。 不幸的是默認情況下會使異常無聲。你可以處理傳遞額外參數的錯誤。

相關問題