【发布时间】:2012-10-27 04:43:46
【问题描述】:
当您 map 可迭代到 multiprocessing.Pool 时,迭代是否在开始时为池中的每个进程划分为一个队列,或者是否存在一个公共队列,当一个进程空闲时从该队列中获取任务?
def generate_stuff():
for foo in range(100):
yield foo
def process(moo):
print moo
pool = multiprocessing.Pool()
pool.map(func=process, iterable=generate_stuff())
pool.close()
因此,鉴于此未经测试的建议代码;如果池中有 4 个进程,每个进程是否被分配了 25 个任务,或者 100 个任务被进程一个接一个地挑选出来,以便每个进程执行不同数量的任务,例如 30 , 26, 24, 20.
【问题讨论】:
-
这与您的问题无关,但如果您的可迭代对象是生成器或其他惰性类型,您可能希望使用
imap而不是map,并传递一个明确的@ 987654326@参数。 -
哦,它是相关的,并且适用,因为我不确定
chunksize的默认值是什么map- 指定默认值的省略支持了我在下面的 cmets 中的怀疑 - 它块一开始就对每个过程进行同样的处理。 -
正如我在回答中提到的,您可以阅读源代码。
map接受chunksize=None。然后,在map_async(它使用)中,if chunksize is None设置chunksize, extra = divmod(len(iterable), len(self.pool) * 4)(然后是if extra、chunksize += 1)。所以,如果你有 8 个工人和 100 个工作,chunksize将是 4。 -
太棒了;还解释了为什么
map在开始时贯穿整个可迭代对象——它正在寻找len。我看看我是否要去yield,那么无论如何我应该使用imap。谢谢大家! -
正如我在下面所说的,这是一种权衡。
map贯穿整个可迭代对象,这意味着在启动和/或运行内存之前会有延迟(对于 100 个整数来说没什么大不了的,但是对于 1000 个网络蜘蛛结果来说,这可能是不可接受的,更不用说 @987654342 @…)。但它更简单一些,你会得到默认的chunksize,而不必计算/测量/猜测一个。
标签: python multiprocessing pool