Python - Pool.map_async只运行iterable中的每个其他元素,除非chunksize = 1

时间:2015-06-14 11:25:53

标签: python multiprocessing pool

我遇到了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。只有这样,部分的所有元素才会传递给工作进程。那是为什么?

1 个答案:

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