Параллельное выполнение списка функций - PullRequest
1 голос
/ 10 мая 2019

Таким образом, используя многопроцессорный модуль, легко запустить функцию параллельно с различными аргументами, такими как:

from multiprocessing import Pool

def f(x):
    return x**2


p = Pool(2)
print(p.map(f, [1, 2]))

Но я заинтересован в выполнении списка функций с одним и тем же аргументом. Предположим, у меня есть две следующие функции:

def f(x):
    return x**2


def g(x):
    return x**3 + 2

Как я могу выполнить их параллельно для одного и того же аргумента (например, x = 1)?

1 Ответ

1 голос
/ 10 мая 2019

Вы можете использовать Pool.apply_async() для этого.Вы связываете задачи в виде (function, arguments_tuple) и передаете каждую задачу на apply_async().

from multiprocessing import Pool
from itertools import repeat


def f(x):
    for _ in range(int(50e6)): # dummy computation
        pass
    return x ** 2


def g(x):
    for _ in range(int(50e6)): # dummy computation
        pass
    return x ** 3


def parallelize(n_workers, functions, arguments):
    # if you need this multiple times, instantiate the pool outside and
    # pass it in as dependency to spare recreation all over again
    with Pool(n_workers) as pool:
        tasks = zip(functions, repeat(arguments))
        futures = [pool.apply_async(*t) for t in tasks]
        results = [fut.get() for fut in futures]
    return results


if __name__ == '__main__':

    N_WORKERS = 2

    functions = f, g
    results = parallelize(N_WORKERS, functions, arguments=(10,))
    print(results)

Пример вывода:

[100, 1000]

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