#python #multithreading #queue
Вопрос:
Допустим, нам нужно запустить три разные функции ( func_a
, func_b
и func_c
) с разными аргументами в многопоточной настройке. Существует 20 наборов аргументов «за func_a
«, 15 » за func_b
«и 10 «за func_c
«, что означает, что мы должны выполнить func_a
20 раз, func_b
15 раз и func_c
10 раз.
Функции могут выполняться одновременно, но у нас не может быть двух вызовов одной и той же функции, выполняемых одновременно; например, у нас не может быть двух потоков, которые оба работают func_a
, хотя и с разными аргументами.
(Представьте себе API с ограниченной скоростью, которые позволяют вам совершать только один вызов на IP-адрес для каждого API.)
Предположим, что все аргументы для всех функций хранятся в словаре:
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
например), но это случай, в котором вызов функции должен быть представлен пула потоков, если только нет других призываю к тому же функция в настоящее время работает в пуле потоков.
Есть ли способ обеспечить соблюдение такого ограничения? Например, можем ли мы использовать для этого очередь?