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