Использование карты ThreadPoolExecutor с передачей нескольких значений - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь выяснить, как использовать ThreadPoolExecutor.map () в библиотеке current.futures. Я использую Python 3.6.

Вот код, показанный ниже

import concurrent.futures
def add(x,y):
    return x+y

with concurrent.futures.ThreadPoolExecutor(1) as executor:
    res = executor.map(add, *(1,2)) # Fails 

Моя проблема в том, что когда я передаю свои параметры, я получаю следующую ошибку:

builtins.TypeError: zip argument #1 must support iteration

Пример в документации по Python показывает только использование одной переменной в качестве входных данных, но я хотел бы использовать N переменных для функции карты. Как мне это сделать?

Я действительно ломаю голову над этим, и был бы признателен, если бы кто-нибудь мог указать мне, как мне нужно отформатировать мои входные параметры.

Я хотел бы иметь возможность сделать что-то вроде этого:

import concurrent.futures
def add(x,y):
    return x+y

numbers = [
(1,2), (2,3), (3,10)
]

with concurrent.futures.ThreadPoolExecutor(1) as executor:
    res = executor.map(add, *numbers) 

Посоветуйте, пожалуйста, как отформатировать входные параметры.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вы можете использовать лямбду, чтобы сделать это следующим образом:

import concurrent.futures
def add(x,y):
    return x+y
numbers = [(1,2), (2,3), (3,10)]
with concurrent.futures.ThreadPoolExecutor(1) as executor:
    res = executor.map(lambda args : add(*args), numbers)   
1 голос
/ 03 июля 2019

вам нужно создать функцию-обертку, которая принимает один аргумент (кортеж) и передает его, используя *, в вашу add функцию.

ВНИМАНИЕ: вы также хотите перебрать результаты, чтобы получить к ним доступ:

import concurrent.futures


def add(x, y):
    return x + y


numbers = [
    (1, 2), (2, 3), (3, 10)
]

res = []
with concurrent.futures.ThreadPoolExecutor(1) as executor:
    for r in executor.map(lambda t: add(*t), numbers):
        res.append(r)

print(res)

...