2016-12-01 68 views
0

我需要製作腳本,它在某種情況下產生並行進程(worker)並使其執行一些IO作業。完成後 - 關閉該過程。 但看起來像進程不會默認退出。產生幾個並行進程並在完成後將它們殺死

這裏是我的方法:

import multiprocessing 

pool = multiprocessing.Pool(4) 

def f(x):       
    sleep(10) 
    print(x) 
    return True 

r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10]) 

但我在IPython中運行它,並whait所有印刷品,在這之後我可以運行的ps aux | grep ipython並看到很多進程。所以看起來這些工人還活着。

也許我做錯了什麼,但是我怎麼能讓這些進程在他們完成任務時終止?如果我想逐個產生大量的工作人員(例如,通過獲取rmq消息),我應該採用什麼方法?

+0

爲什麼你要通過'None'池?這不就是你打算使用的進程數量嗎? – roganjosh

+0

是的,謝謝!修正了它,沒有改變。 – Paul

回答

1

池聲明池時會產生工作進程。他們不會被殺死,直到游泳池關閉。相反,他們在那裏等待更多工作出現在隊列中。

如果你改變你的代碼:

r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10]) 
pool.close() 
pool.join() 
print "check ps ax now" 
sleep (10) 

你會看到過程已經消失了游泳池。

另一件事,您的程序可能無法按預期工作,因爲在聲明池後聲明函數f。我必須更改pool = multiprocessing.Pool(4)以遵循函數f聲明,但這可能因Python版本而異。無論如何,如果你遇到奇怪的「模塊沒有屬性」 - 異常,這就是原因。

Hannu

+0

是的,我得到了這個異常,所以我移動了池聲明。謝謝!這種方法是否可以異步產生一個接一個的proc? – Paul

+0

進程已在pool = multiprocessing.Pool(4)中創建。它不需要map_async或任何其他作業提交命令來啓動它們。池的想法是讓進程準備好處理您決定提供它們的任何任務,並且進程只有在關閉池並處理完最後的任務時纔會終止。使用map_async來處理數據列表是完全正確的。這正是它如何使用。 – Hannu

+0

謝謝! :)我在這裏問另一個問題:http://stackoverflow.com/questions/40913207/return-value-from-spawned-multiprocessing-process你可能會感興趣。 :) – Paul

相關問題