2011-10-04 60 views
20

我在使用python多處理庫時遇到了一個奇怪的問題。Python多處理 - 當一個進程完成時如何釋放內存?

我的代碼如下:我爲每個「符號,日期」元組產生一個進程。之後我將結果結合起來。

我期望當一個進程完成了「符號,日期」元組的計算後,它應該釋放它的內存?顯然情況並非如此。我看到數十個進程(儘管我將進程池的大小設置爲7)在機器中暫停1。它們不消耗CPU,並且不釋放內存。

如何讓進程在完成其計算後釋放其內存?

謝謝!

¹由「暫停」我的意思是他們在ps命令狀態顯示爲「S +」

def do_one_symbol(symbol, all_date_strings): 
    pool = Pool(processes=7) 
    results = []; 
    for date in all_date_strings: 
     res = pool.apply_async(work, [symbol, date]) 
     results.append(res); 

    gg = mm = ss = 0; 
    for res in results: 
     g, m, s = res.get() 
     gg += g; 
     mm += m; 
     ss += s; 

回答

22

你有沒有嘗試使用pool.close關閉池,然後等待過程pool.join完成,因爲如果父進程繼續運行,並不會等待子進程,他們將成爲zombies

+0

這是我的腳本的根本原因引起的點的重新啓動由於> 4GB內存的90%被消耗:)謝謝! –

11

嘗試設置池中的maxtasksperchild參數。如果你不這樣做,那麼這個過程會被池重複使用,所以內存永遠不會被釋放。設置時,該過程將被允許死亡,並在其中創建一個新過程。這將有效地清理內存。

我想這在2.7的新功能:http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

+0

我一直在使用這種方法,工作正常。問題是,爲什麼它不釋放內存?或者也許不夠快......? – Elvin