Можно ли отправить вызов функции в ThreadPoolExecutor на основе того, что выполняется в нем каждый раз?

#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 например), но это случай, в котором вызов функции должен быть представлен пула потоков, если только нет других призываю к тому же функция в настоящее время работает в пуле потоков.

Есть ли способ обеспечить соблюдение такого ограничения? Например, можем ли мы использовать для этого очередь?