在python中将任务分发给模块

时间:2013-07-22 20:06:21

标签: python multiprocessing

我有一个名为 results 的列表和一个名为 modules 的模块的相应列表,以及一些适用于所有模块的选项结果和模块。每个模块都有一个函数 save ,需要在与其对应的结果上调用。所以我可以做类似以下的事情:

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 个答案:

答案 0 :(得分:1)

如果result are 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)