我刚刚学习了这个文档部分enter link description here
据我所知,这个函数
import multiprocessing
pool = multiprocessing.Pool()
print pool.map(f, range(10))
将创建一个任务块,其数量等于核心的数量。结果与从sequenze得到的输入顺序相同。你知道吗
文件还说--- will block till complete:
假设上面的f是一个复函数。我们有4个CPU和一个块大小为4的块,它是否阻塞直到所有4都将完成,然后才得到下一个块?你知道吗
所以在更糟糕的情况下,3个空闲内核会闲置很长时间,直到最后一个内核完成?你知道吗
你说得有点对。你知道吗
您还可以读取
map
接受chunksize
参数,该参数可用于调整提交给池进程的任务块的大小。如果这些块足够小,那么每个进程应该公平地进行,所有的内核大部分时间都在工作。你知道吗您似乎认为
chunksize
将匹配内核的数量。这是不对的。未指定时,chunksize
有一个实现定义的值,它不等于核心数,至少在CPython(引用解释器)上是这样。在编写本文时,在Python 2.7和3.7上,使用的计算是:len(self._pool)
是工作进程的数量,len(iterable)
是输入iterable中的项数(如果它没有定义的长度,则list
将其指定)。你知道吗所以对于你的情况,计算方法是:
例如,对于一个四核机器,
chunksize, extra = 0, 10
,然后if
检查将chunksize
更改为1
。因此,每个worker将获取一个输入值(0、1、2和3几乎会立即被抓取),然后当每个worker完成时,它将再抓取一个项目。假设所有物品所用的时间大致相同,您将进行两轮全占用(使用4/4核),然后进行一轮半占用(使用2/4核)。最坏的情况是,最后一个开始的任务需要运行最长的时间。如果这是可以提前知道的,你应该尝试组织你的输入来防止这一点(把最昂贵的项目放在第一位,这样在不完全占用的情况下运行的最终任务会很短,并且完成得很快,从而最大化并行性);否则,这是不可避免的。你知道吗对于更多的任务,是的,默认的
chunksize
将增加,例如,对于四个核上的100个输入,您将有chunksize
个7
,生成15个块,最后一个块的大小过小。所以是的,对于运行时变化很大的任务,您可能会冒着占用率低的长尾风险。如果这是一种风险,请显式地将chunksize
设置为1
;这样会降低总体性能(使其更接近imap
),但它消除了一个工作线程在一个块中处理第1项(共7项)而其他所有核心处于空闲状态的可能性。你知道吗相关问题 更多 >
编程相关推荐