1

我有一个名为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。

4

1 回答 1

1

如果其中的项目result 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)
于 2013-07-22T20:10:07.603 回答