Запустите одну и ту же функцию параллельно с различными параметрами и узнайте, какой параллельный запуск завершился python - PullRequest
0 голосов
/ 05 марта 2020

У меня есть функция выполнения, которая должна выполняться на нескольких устройствах параллельно. И мне нужно вызывать разные функции при завершении каждого параллельного запуска. Я не могу дождаться завершения всех параллельных вызовов, так как в зависимости от переданного параметра это занимает совсем другое время.

    def func1(device, arg1, arg2):
        # do something

    for device in devices:
       # Call func1 with different arguments in parallel
       # If one of the parallel is finished call func2(arg, arg1, arg2) with different arguments.

Как я могу сделать это в Python?

1 Ответ

1 голос
/ 05 марта 2020

Смотрите этот пример кода, который использует future.ThreadPoolExecutor для параллельного выполнения.

from concurrent.futures import ThreadPoolExecutor, Future, as_completed

devices = []


def func1(device, arg1, arg2):
    pass


def do_after_func1(func1_result: Future):
    identifier = func1_result.arg
    result = func1_result.result()
    # do what ever
    pass


device_executors = ThreadPoolExecutor(max_workers=20)
args = []  # can be anything
futures = []
for device in devices:
    tracker = device_executors.submit(func1, *args)
    tracker.arg = "some-identififcation-if-you-need"
    tracker.add_done_callback(do_after_func1)
    futures.append(tracker)

Вы можете отправить что-либо для параллельного выполнения в виде callable, а результат можно направить в функцию обратного вызова do_after_func1. Вы можете решить, что будет потом называться здесь. Все это происходит параллельно.

Вы также можете использовать ProcessPoolExecutor, если считаете, что необходимо несколько процессов.

Вы можете узнать больше из официальной документации.

...