2016-02-23 59 views
2

我有一個簡單的代碼,如下所示。第一個進程阻止隊列,所以他們都沒有完成。如何終止多處理池中的AsyncResult?

我希望能夠殺死一個AsyncResult,如果它超過.get()超時,所以我的池隊列可以繼續前進。 但是我找不到任何簡單的方法來完成它,而不修改「myfunc」。有沒有人有一個想法如何實現?

import multiprocessing 
import time 


def myf(x): 
    if x == 0: 
     time.sleep(100) 
    else: 
     time.sleep(2) 
    return 'done' 


pool = multiprocessing.Pool(processes=1) 
results = [] 
for x in range(8):   
    results.append(pool.apply_async(myf,args=[x])) 
pool.close() 

for res in results: 
    try: 
     print res.get(3) 
    except Exception as e: 
     print 'time out' 
+0

您的代碼將在每個被阻止的進程3秒內「繼續」。你是說你想要自己取消myf嗎? – tdelaney

+0

我知道for循環會繼續,但我也希望池隊列繼續前進。例如,我想終止「myf」,以便下一個池進程啓動。 – user1477337

+1

你可以看看這個:http://stackoverflow.com/questions/492519/timeout-on-a-python-function-call,但如果我正確理解''multiprocessing.pool''源代碼,工人「功能,沒有辦法做到這一點,而不用改變'myf'或將其包裹在某種警報中。 –

回答

3

multiprocessing.Pool尚未設計用於此類用例。

強迫其中一名工人自殺將導致未定義的行爲,這可能會因爲永遠停留在那裏而導致程序崩潰。

有庫可以解決您的問題。 pebble允許您爲工作人員設置超時時間,並在時間限制超時後停止工作。

Similar question asked previously.