2013-07-22 20 views
1

我有一個名爲結果列表,並命名爲模塊模塊的對應列表,以及一些選項適用於所有的結果和模塊。每個模塊都有一個功能保存需要在對應的結果上調用它。所以我可以做類似如下:分發任務模塊在python

q = deque(results) 
for module in modules: 
    module.save(q.popleft(), options) 

或等價:

for i in range(len(modules)): 
    modules[i].save(results[i], options) 

這個偉大的工程。但是,我沒有理由不能同時做所有事情。但是,如何以最好的方式並行處理這個問題正在避開我,即使它看起來應該非常直截了當。有人可以請指點我正確的方向嗎? Python 2.6.6,請。

回答

1

如果項目在resultare picklable,那麼你使用Pool.apply_async運行module.save同時這樣的:

import multiprocessing as mp 
import itertools as IT 
import logging 

logger = mp.log_to_stderr(logging.DEBUG) 
logger.setLevel(logging.DEBUG) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    for module, result in IT.izip(modules, results): 
     pool.apply_async(module.save, args=(result, options)) 

    pool.close() 
    pool.join() 

在module.py:

import logging  
logger = logging.getLogger(__name__) 

def save(): 
    logger.debug('Starting save') 
    ... 
    logger.debug('Exiting save') 

logger.setLevel(logging.DEBUG)運行,你會看到大量的調試信息將幫助你理解Python在每個進程的代碼中的位置。

要關閉日誌記錄,只是該行更改爲

logging.disable(logging.CRITICAL) 
+0

我有這個一個很奇怪的問題。它運行所有的模塊,它們做的都很好,但程序不會終止。一切完成後,它只是坐着,然後最終崩潰與MemoryError。任何想法爲什麼? – rhombidodecahedron

+2

Do *模塊的所有*功能都會終止嗎?沒有看到更多的代碼很難調試。提供一個[可運行示例](http://sscce.org/)來證明問題會很好,儘管我意識到這可能很難做到。我知道 - 我將編輯帖子以解釋如何輕鬆添加日誌記錄。這樣,您就會更好地瞭解每個進程在崩潰之前的位置。 – unutbu

+0

感謝您的幫助。 :) – rhombidodecahedron