Использование concurrent.futures.ThreadPoolExecuter () с kwargs - PullRequest
0 голосов
/ 12 февраля 2020

Как я могу использовать concurrent.futures.ThreadPoolExecuter (). Map со списком, который содержит словарь kwargs?

Используя забавный c только с одним аргументом, я могу использовать такой исполнитель, как этот :

import concurrent.futures

def one_arg(arg):
    print(arg)

arg_list = [1, 2, 3]

with concurrent.futures.ThreadPoolExecutor() as executer:
    executer.map(one_arg, arg_list)

output:
1
2
3

Теперь давайте рассмотрим c с несколькими входными аргументами:

def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print('kwarg_1: {} - kwarg_2: {} - kwarg_3: {}'.format(kwarg_1, kwarg_2, kwarg_3))

kwargs = {"kwarg_1": "1_1", "kwarg_2": "1_2", "kwarg_3": "1_3"}
some_kwargs(**kwargs)

output:
'kwarg_1: 1_1 - kwarg_2: 1_2 - kwarg_3: 1_3'

Теперь, что мне действительно нужно, так это то, как вызвать some_kwargs с использованием потоков, когда У меня есть list kwargs?

kwargs_list = [{"kwarg_1": "1_1", "kwarg_2": "1_2", "kwarg_3": "1_3"},
               {"kwarg_1": "2_1", "kwarg_2": "2_2", "kwarg_3": "2_3"},
               {"kwarg_1": "3_1", "kwarg_2": "3_2", "kwarg_3": "3_3"}]

with concurrent.futures.ThreadPoolExecutor() as executer:
    executer.map(some_kwargs, **kwargs_list)  # TypeError: map() argument after ** must be a mapping, not list

1 Ответ

1 голос
/ 13 февраля 2020

Используйте лямбда-функцию для переноса some_kwargs:

with concurrent.futures.ThreadPoolExecutor() as executer:
    executer.map(lambda x: some_kwargs(**x), kwargs_list)

Обратите внимание, что **kwargs_list поднимает выше TypeError, поскольку kwargs_list является списком, а не диктатом.

...