Как одновременно вызывать несколько отдельных функций и получать упорядоченные результаты в Python concurrent.futures? - PullRequest
0 голосов
/ 20 декабря 2018

Предположим, у меня есть две независимые функции.Я хотел бы вызывать их одновременно, используя Python concurrent.futures.ThreadPoolExecutor.Есть ли способ вызвать их с помощью Executor и убедиться, что они возвращаются в порядке их отправки?

Я понимаю, что это возможно с Executor.map, но я хочу распараллелить две отдельные функции, а неодна функция с целочисленным вводом.

У меня есть пример кода ниже, но он не гарантирует, что fn_a вернется первым (в силу конструкции wait).

from concurrent.futures import ThreadPoolExecutor, wait
import time


def fn_a():
    t_sleep = 0.5
    print("fn_a: Wait {} seconds".format(t_sleep))
    time.sleep(t_sleep)
    ret = t_sleep * 5  # Do unique work
    return "fn_a: return {}".format(ret)


def fn_b():
    t_sleep = 1.0
    print("fn_b: Wait {} seconds".format(t_sleep))
    time.sleep(t_sleep)
    ret = t_sleep * 10  # Do unique work
    return "fn_b: return {}".format(ret)


if __name__ == "__main__":
    with ThreadPoolExecutor() as executor:
        futures = []
        futures.append(executor.submit(fn_a))
        futures.append(executor.submit(fn_b))
        complete_futures, incomplete_futures = wait(futures)
        for f in complete_futures:
            print(f.result())

Мне также интересно узнать, есть ли способ сделать это с joblib

1 Ответ

0 голосов
/ 20 декабря 2018

Думаю, я нашел разумный вариант, используя лямбду и частичные числа.Частицы позволяют мне передавать аргументы некоторым функциям в распараллеливаемой итерации, но не другим.

from functools import partial
import concurrent.futures

fns = [partial(fn_a), partial(fn_b)]
data = []
with concurrent.futures.ThreadPoolExecutor() as executor:
    try:
        for result in executor.map(lambda x: x(), fns):
            data.append(result)

Так как он использует executor.map, он возвращается в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...