gpt4 book ai didi

python - 如何将生成器用作具有多处理映射函数的可迭代对象

转载 作者:太空宇宙 更新时间:2023-11-03 14:52:52 25 4
gpt4 key购买 nike

当我将生成器用作 multiprocessing.Pool.map 函数的可迭代参数时:

pool.map(func, iterable=(x for x in range(10)))

func 被调用之前,生成器似乎已经完全耗尽。

我想生成每个项目并将其传递给每个进程,谢谢

最佳答案

multiprocessing.map 在处理之前将没有 __len__ 方法的可迭代对象转换为列表。这样做是为了帮助计算 chunksize,池使用它来对 worker 参数进行分组并减少调度作业的往返成本。这不是最优的,尤其是当 chunksize 为 1 时,但由于 map 必须以一种或另一种方式耗尽迭代器,这通常不是一个重要的问题。

相关代码在pool.py中。注意它对 len 的使用:

def _map_async(self, func, iterable, mapper, chunksize=None, callback=None,
error_callback=None):
'''
Helper function to implement map, starmap and their async counterparts.
'''
if self._state != RUN:
raise ValueError("Pool not running")
if not hasattr(iterable, '__len__'):
iterable = list(iterable)

if chunksize is None:
chunksize, extra = divmod(len(iterable), len(self._pool) * 4)
if extra:
chunksize += 1
if len(iterable) == 0:
chunksize = 0

关于python - 如何将生成器用作具有多处理映射函数的可迭代对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44708312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com