我遇到了map_async的一个奇怪问题。 我有一堆rsync作业,我尝试使用map_async进行并行化。 问题是map_async只运行iterable中的每个其他元素(即 - 只有输入的一半)。 问题的抽象看起来像这样:
import multiprocessing
def run_async(section):
print "Running section: ", section
if __name__ == '__main__':
sections = ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf' ]
pool = multiprocessing.Pool(processes=5)
result = pool.map_async(run_async, sections)
pool.close()
pool.join()
结果不是我的预期,run_async只适用于部分的每个其他元素,结果是:
Running section: alpha
Running section: charlie
Running section: echo
Running section: golf
克服这个问题的方法是将chuncksize = 1传递给map_async。只有这样,部分的所有元素才会传递给工作进程。那是为什么?
答案 0 :(得分:0)
在我的电脑上输出:
[amit@amit build]$ python2.7 so.py
Running section: alpha
你知道为什么吗?因为工作的子进程和主进程结束之间存在竞争。
添加到代码的末尾:
pool.close()
pool.join()
修复它:
[amit@amit build]$ python2.7 so.py
Running section: alpha
Running section: bravo
Running section: charlie
Running section: delta
Running section: echo
Running section: golf
Running section: foxtrot