Chunksize不会影响正在使用多少个内核,这由的
processes参数设置
Pool。Chunksize设置您传递给的可迭代项的数量,这些项在称为“任务”的
Pool.map每个工作进程
中一次 分配
Pool(以下图显示了Python 3.7.1)。
如果您设置
chunksize=1,则只有在完成之前收到的工作后,工作流程才能在新任务中获得新项目。对于
chunksize >1一个任务来说,一个工人一次获取整批物品,当它完成时,如果还有剩余,它将获得下一批。
chunksize=1由于滴灌需要更多的进程间通信(IPC),因此可以在调度时灵活地逐一分配项目,同时降低总体吞吐量。
在我的游泳池的CHUNKSIZE算法的深入分析在这里,我定义了
工作单位 处理 一个 可迭代的项目 taskel
,以避免命名冲突字的“任务”的游泳池的使用。任务(作为工作单元)由任务组组成
chunksize。
你会设定
chunksize=1,如果你不能预测taskel多长时间需要完成,例如优化问题,在处理时间跨越taskels良莠不齐。此处滴灌可防止工人流程坐在一堆未接触的物品上,而在一个沉重的任务板上el缩时,可防止任务中的其他物品分配到闲置的工人流程中。
否则,如果所有任务组都需要相同的时间才能完成,则可以设置
chunksize=len(iterable) //processes,以使任务仅在所有工作进程中分配一次。请注意,如果
len(iterable) / processes有剩余,这将产生比进程(进程+
1)多的任务。这有可能严重影响您的总体计算时间。在先前链接的答案中了解有关此内容的更多信息。
仅供参考,这是源代码的一部分,
Pool如果未设置,则内部计算块大小:
# Python 3.6, line 378 in `multiprocessing.pool.py` if chunksize is None: chunksize, extra = divmod(len(iterable), len(self._pool) * 4) if extra: chunksize += 1 if len(iterable) == 0: chunksize = 0



