假设我们必须在多线程设置中使用不同的参数运行三个不同的函数(func_a
、func_b
和 func_c
)。 func_a
有 20 组参数,func_b
有 15 组参数,func_c
有 10 组参数,这意味着我们必须运行 func_a
20 次,func_b
15 次和 func_c
10 次。
函数可以同时运行,但不能同时运行两个对同一个函数的调用;例如我们不能有两个线程同时运行 func_a
,尽管参数不同。
(想象一下有速率限制的 API,它只允许您对每个 API 的每个 IP 地址进行一次调用。)
假设所有函数的所有参数都保存在字典中:
function_calls = {
'func_a':{ {'n':12, 'm':'k'}, ..., {'n':23, 'm':'j'} },
'func_b':{ {'n':22, 'm':'l'}, ..., {'n':57, 'm':'z'} },
'func_c':{ {'n':35, 'm':'v'}, ..., {'n':79, 'm':'x'} }
}
有没有办法运行一个由三个工人组成的线程池,他们每次只执行每个函数参数对中的一个?
显然,如果“每个函数每次只有一个线程”的限制不存在,您可以简单地使用任何现有的多线程方法(例如使用 ThreadPoolExecutor
),但这是仅当线程池中当前没有对同一函数的其他调用正在运行时,才应将函数调用提交给线程池的用例。
有没有办法强制执行这样的限制?例如,我们可以使用 Queue 吗?