multiprocessing Pool(processes=n) 如何处理过多的 Pool 请求?

How does multiprocessing Pool(processes=n) handle excessive Pool requests?

假设我有如下代码——我需要 运行 一个函数(具有不同的参数)x 次。但是,我的池数较少——例如x/2.

args_list = []

# Range(8) is just an example. My args are more complex.
for r in Range(8):
    args_list.append(r)

with Pool(4) as proc_pool:
    results = proc_pool.map(my_func, args_list)
    proc_pool.close()
    proc_pool.join()

Pool 一次只尝试处理 4 个——然后继续处理下一个 4 个,还是一次处理所有 8 个——但只在 4 个池中?

如果 Pool 将尝试同时处理 4 个 Pool 中的所有 8 个,处理这个问题的最佳方法是什么? (我可以将 with Pool 代码放在一个循环中,一次只使用 4 个池。)

我阅读了文档,但我不清楚。

Pool的第一个参数中传递的数字是池中的工作进程数(在本例中为 4)。 map 函数将 运行 每个参数。每次工作人员完成时,它都可以用于 运行 另一个参数。

为了说明这一点,请考虑以下内容:

import time
def my_func(r):
   if r == 1:
       time.sleep(120)
   return r * r

首先会发生的事情是 4 运行 将派遣工人。除了 r == 1 之外,所有这些几乎都会立即完成。当工作人员完成时,工作人员正在 re-used 进行另一个输入。因此,在示例中,7 个工人几乎会立即完成,但最后一个工人大约需要 2 分钟。由于 map 函数将等待所有工作人员完成 return 结果,因此 map 函数将需要 2 分钟才能完成。

再举个例子:

import time
def my_func(r):
   if r in (1, 3, 5, 7):
       time.sleep(120)
   return r * r

一半的 运行 几乎会立即完成,其中 4 个 运行 需要 2 分钟。如果 运行 中的五个需要 2 分钟(比如 r in (1, 2, 3, 5, 7)),则总时间将为 4 分钟,因为 2 分钟内有 4 个进程在等待,而 2 分钟内有 1 个进程在等待.