gpt4 book ai didi

python - multiprocessing pool.map 按特定顺序调用函数

转载 作者:IT老高 更新时间:2023-10-28 20:54:47 27 4
gpt4 key购买 nike

如何让 multiprocessing.pool.map 按数字顺序分配进程?


更多信息:
我有一个程序可以处理几千个数据文件,为每个文件绘制一个图。我正在使用 multiprocessing.pool.map 将每个文件分发到处理器,并且效果很好。有时这需要很长时间,在程序运行时查看输出图像会很好。如果 map 进程按顺序分发快照,这会容易得多;相反,对于我刚刚执行的特定运行,分析的前 8 个快照是:0、78、156、234、312、390、468、546。有没有办法让它按数字顺序更紧密地分布它们?


示例:
这是一个包含相同关键元素的示例代码,并显示相同的基本结果:

import sys
from multiprocessing import Pool
import time

num_proc = 4; num_calls = 20; sleeper = 0.1

def SomeFunc(arg):
time.sleep(sleeper)
print "%5d" % (arg),
sys.stdout.flush() # otherwise doesn't print properly on single line

proc_pool = Pool(num_proc)
proc_pool.map( SomeFunc, range(num_calls) )

产量:

   0  4  2  6   1   5   3   7   8  10  12  14  13  11   9  15  16  18  17  19

答案:

来自@Hayden:使用“chunksize”参数,def map(self, func, iterable, chunksize=None)

更多信息:
chunksize 决定了每次分配给每个处理器的迭代次数。例如,我上面的示例使用了 2 的 block 大小——这意味着每个处理器关闭并在函数的 2 次迭代中执行其操作,然后返回更多(“ checkin ”)。 chunksize 背后的权衡是,当处理器必须与其他处理器同步时,“ checkin ”会产生开销——这表明你想要一个 large chunksize。另一方面,如果你有大块,那么一个处理器可能会完成它的 block ,而另一个处理器还有很长的时间要走——所以你应该使用 small chunksize。我想额外的有用信息是有多少范围,每个函数调用可以花费多长时间。如果它们真的都应该花费相同的时间 - 使用大块大小会更有效。另一方面,如果某些函数调用的时间可能是其他函数的两倍,那么您需要一个较小的 block 大小,这样处理器就不会等待。

对于我的问题,每个函数调用都应该花费非常接近相同的时间(我认为),所以如果我希望按顺序调用进程,我会因为 checkin 而牺牲效率开销。

最佳答案

发生这种情况的原因是因为每个进程在调用 map 时都被赋予了预定义的工作量,这取决于 chunksize。我们可以通过查看 pool.map 的源代码来计算出默认的 chunksize

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

因此,对于 20 个范围和 4 个进程,我们将获得 2 个的 chunksize

如果我们修改您的代码以反射(reflect)这一点,我们应该会得到与您现在得到的结果相似的结果:

proc_pool.map(SomeFunc, range(num_calls), chunksize=2)

这会产生输出:

0 2 6 4 1 7 5 3 8 10 12 14 9 13 15 11 16 18 17 19

现在,设置 chunksize=1 将确保池中的每个进程一次只分配一个任务。

proc_pool.map(SomeFunc, range(num_calls), chunksize=1)

与未指定 block 大小时相比,这应该确保相当好的数字排序。例如, block 大小为 1 会产生输出:

0 1 2 3 4 5 6 7 9 10 8 11 13 12 15 14 16 17 19 18

关于python - multiprocessing pool.map 按特定顺序调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17903355/

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