Я надеюсь, что это не дубликат, но я не смог найти полностью удовлетворяющий ответ для этой конкретной проблемы.
Учитывая функцию с несколькими аргументами списка и одним итерируемым, например. здесь с двумя списками
def function(list1, list2, iterable):
i1 = 2*iterable
i2 = 2*iterable+1
list1[i1] *= 2
list2[i2] += 2
return(list1, list2)
Доступ к каждому списку осуществляется по разным записям, поэтому операции разделены и могут быть парализованы. Каков наилучший способ сделать это с помощью многопроцессорной обработки Python?
Одним из простых способов распараллеливания было бы использование функции карты:
import multiprocessing as mp
from functools import partial
list1, list2 = [1,1,1,1,1], [2,2,2,2,2]
func = partial(function, list1, list2)
pool = mp.Pool()
pool.map(func, [0,1])
Проблема в том, что если кто-то делает это, он создает для каждого процесса копию списков (если я правильно понимаю функцию карты) и затем работает параллельно в разных позициях в этих копиях. В конце (после того, как были затронуты две итерации [0,1]) результат pool.map будет
[([3, 1, 1, 1, 1], [2, 4, 2, 2, 2]), ([1, 1, 3, 1, 1], [2, 2, 2, 4, 2])]
но я хочу
[([3, 1, 3, 1, 1], [2, 4, 2, 4, 2])].
Как этого добиться? Следует ли разделить список на итерацию раньше, запустить определенные операции параллельно, а затем снова объединить их?
Заранее спасибо и извините, если я что-то путаю, я только начал использовать multiprocessing-библиотеку.
EDIT: Операции над разными частями списка могут быть парализованы без синхронизации, операции над всем списком не могут быть парализованы (без синхронизации). Поэтому решение моей конкретной проблемы состоит в том, чтобы разделить списки и функции на операции и на части списков. После этого объединяются части списков, чтобы получить весь список обратно.