地图上的Python多处理

2024-04-25 19:01:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚学习了这个文档部分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个空闲内核会闲置很长时间,直到最后一个内核完成?你知道吗


Tags: 函数文档importmap数量herelinkrange
2条回答

你说得有点对。你知道吗

您还可以读取map接受chunksize参数,该参数可用于调整提交给池进程的任务块的大小。如果这些块足够小,那么每个进程应该公平地进行,所有的内核大部分时间都在工作。你知道吗

您似乎认为chunksize将匹配内核的数量。这是不对的。未指定时,chunksize有一个实现定义的值,它不等于核心数,至少在CPython(引用解释器)上是这样。在编写本文时,在Python 2.7和3.7上,使用的计算是:

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

len(self._pool)是工作进程的数量,len(iterable)是输入iterable中的项数(如果它没有定义的长度,则list将其指定)。你知道吗

所以对于你的情况,计算方法是:

        chunksize, extra = divmod(10, numcores * 4)
        if extra:
            chunksize += 1

例如,对于一个四核机器,chunksize, extra = 0, 10,然后if检查将chunksize更改为1。因此,每个worker将获取一个输入值(0、1、2和3几乎会立即被抓取),然后当每个worker完成时,它将再抓取一个项目。假设所有物品所用的时间大致相同,您将进行两轮全占用(使用4/4核),然后进行一轮半占用(使用2/4核)。最坏的情况是,最后一个开始的任务需要运行最长的时间。如果这是可以提前知道的,你应该尝试组织你的输入来防止这一点(把最昂贵的项目放在第一位,这样在不完全占用的情况下运行的最终任务会很短,并且完成得很快,从而最大化并行性);否则,这是不可避免的。你知道吗

对于更多的任务,是的,默认的chunksize将增加,例如,对于四个核上的100个输入,您将有chunksize7,生成15个块,最后一个块的大小过小。所以是的,对于运行时变化很大的任务,您可能会冒着占用率低的长尾风险。如果这是一种风险,请显式地将chunksize设置为1;这样会降低总体性能(使其更接近imap),但它消除了一个工作线程在一个块中处理第1项(共7项)而其他所有核心处于空闲状态的可能性。你知道吗

相关问题 更多 >