Я надеюсь, что это не дубликат, но я не смог найти полностью удовлетворительный ответ для этой конкретной проблемы.
Дана функция с несколькими аргументами списка и одним итератором, например, здесь с двумя списками
def function(list1, list2, iterable):
i1 = 2*iterable
i2 = 2*iterable+1
list1[i1] *= 2
list2[i2] += 2
return(list1, list2)
Каждый список принимается в разных записях, поэтому операции разделяются и могут быть парализованы. Каков наилучший способ сделать это с помощью многопроцессорной обработки Python?
Один простой способ распараллеливания - использование функции map:
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])].
Как этого добиться? Стоит ли разделить список по итеративным ранее, выполнить конкретные операции параллельно, а затем объединить их снова?
Заранее спасибо и извините, если я что-то перепутал, я только начал использовать мультипроцессорную библиотеку.
РЕДАКТИРОВАТЬ: Операции над различными частями в списке могут быть парализованы без синхронизации, операции над всем списком не могут быть парализованы (без синхронизации). Поэтому решение моей конкретной проблемы состоит в том, чтобы разбить списки и функцию на операции и на части списков. После этого объединяются части списков, чтобы получить весь список обратно.