выполняя n итераций для l oop параллельно - PullRequest
0 голосов
/ 05 апреля 2020

Давайте предположим, что у нас есть вложенное for l oop в python, где самый внутренний l oop вызывает некоторую функцию fun:

for x1 in ['a','b','c','d','e']:
    for x2 in [1,2,3]:
        fun(x1,x2)

Как это можно переписать, такое, что n вызовы fun выполняются параллельно? Т.е. для n==2 порядок выполнения будет следующим:

  • fun('a',1) и fun('a',2) выполняются параллельно.
  • при завершении одного из них запускается fun('a',3)
  • когда один из них завершается, fun('b',1) запускается
  • ... и так далее

Как этого можно достичь в большинстве pythoni c способ?

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Объедините параметры в понимании списка. Затем вы можете использовать multiprocessing.Pool.starmap для вызова функции с несколькими аргументами.

from multiprocessing import Pool

x1 = ['a','b','c','d','e']
x2 = [1,2,3]

param_combinations = [(i, j) for i in x1 for j in x2] 

def func(x, y):
    return f'{x}_{y}'

with Pool(processes=3) as p:
    results = p.starmap(func, param_combinations)

>>>results
['a_1',
 'a_2',
 'a_3',
 'b_1',
 'b_2',
 'b_3',
 'c_1',
 'c_2',
 'c_3',
 'd_1',
 'd_2',
 'd_3',
 'e_1',
 'e_2',
 'e_3']
1 голос
/ 05 апреля 2020

Вы можете использовать модуль multiprocessing:

from multiprocessing import Pool
from itertools import product

if __name__ == "__main__":
    l1 = ['a', 'b', 'c', 'd', 'e']
    l2 = [1, 2, 3]
    n = 2
    with Pool(n) as pool:
        pool.starmap(fun, product(l1, l2))

Используя product, мы создаем все пары подряд:

>>> list(product(['a', 'b'], [1, 2]))
[('a', 1), ('a', 2), ('b', 1), ('b', 2)]

Затем мы можем создать Pool с n процессами и передать каждую пару в fun с помощью функции starmap.

Создав Pool и передав первый параметр n, мы имеем n процессов, которые берут каждый элемент из product по порядку, таким образом, это создает именно тот эффект, который вы искали - всякий раз, когда один из них освобождается, он берет следующую пару в строке.

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