我對python相當陌生。 我正在使用多處理模塊讀取stdin上的文本行,以某種方式轉換它們並將它們寫入數據庫。下面是我的代碼片段:python pool apply_async和map_async不會阻塞完整隊列
batch = []
pool = multiprocessing.Pool(20)
i = 0
for i, content in enumerate(sys.stdin):
batch.append(content)
if len(batch) >= 10000:
pool.apply_async(insert, args=(batch,i+1))
batch = []
pool.apply_async(insert, args=(batch,i))
pool.close()
pool.join()
現在,一切工作正常,直到我去處理龐大的輸入文件(億萬行),我管到我的Python程序。在某個時候,當我的數據庫變慢時,我發現內存已經滿了。
經過一番遊戲後,事實證明,pool.apply_async和pool.map_async永遠都不會阻塞,因此要處理的調用隊列變得越來越大。
什麼是正確的方法來解決我的問題?我期望一個可以設置的參數,一旦達到某個隊列長度,就會阻塞pool.apply_async調用。 Java中的AFAIR可以爲ThreadPoolExecutor提供一個具有固定長度的BlockingQueue。
謝謝!
_「事實證明,pool.apply_async以及pool.map_async從來沒有阻止」 _ - 一切,我一直在尋找 – leon 2013-07-05 23:28:41