Существует две функции:
def tibidam(..., foo_dyn, index):
print("(" + str(index) + ") B:", foo_dyn)
for i in range(...):
for j ...
if j not in foo_dyn:
foo_dyn[ep] = j
print("(" + str(index) + ") A:", foo_dyn)
def tata(..., foo):
foo_dyn = Array('i', len(foo))
foo_dyn = foo
with Pool(processes=4) as pool:
pool.starmap(tibidam, [(..., foo_dyn, i)
for i in range(4)])
return foo
Вывод (в формате):
foo : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(0) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(1) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(2) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(3) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(0) A: [27, 1, 2, 3, 64, 5, 6, 7, 80, 9, 10, 11]
(2) A: [0, 1, 64, 3, 4, 5, 13, 7, 8, 9, 92, 11]
(3) A: [0, 1, 2, 31, 4, 5, 6, 73, 8, 9, 10, 18]
(1) A: [0, 18, 2, 3, 4, 27, 6, 7, 8, 99, 10, 11]
...
Ожидаемый вывод (в формате):
foo : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(0) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(1) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(2) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(3) B: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(0) A: [27, 1, 2, 3, 64, 5, 6, 7, 80, 9, 10, 11]
(2) A: [27, 1, 55, 3, 64, 5, 13, 7, 80, 9, 92, 11]
(3) A: [27, 1, 55, 31, 64, 5, 13, 73, 80, 9, 92, 18]
(1) A: [27, 87, 55, 31, 64, 88, 13, 73, 80, 99, 92, 18]
...
Как изменить foo_dyn
у всех работников, когда foo_dyn
изменяется? Кажется, что pool.starmap(...)
создает копию foo_dyn
для каждого процесса ... Нет, я хочу передать foo_dyn
в пул только один раз. Но опять же, без использования глобальных переменных, вообще.
AFAIK, multiprocessing.Pool
поддерживает аргументы initializer
и initargs
: я могу написать собственный инициализатор:
_init(foo):
global foo_dyn
foo_dyn = foo
, но он использует глобальную переменную foo_dyn
(кстати, использование функции _init
не решает проблему). Попутно я увидел несколько вопросов, почти с той же проблемой. Однако все решения были связаны с использованием глобальных переменных.
[EDITED]
Я нашел решение, не используя глобальные переменные:
from multiprocessing import Pool, Manager
def tibidam(..., foo_dyn, index):
for i in range(...):
for j ...
if j not in foo_dyn:
foo_dyn[ep] = j
def tata(..., foo):
foo_dyn = Manager().list(foo)
with Pool(processes=4) as pool:
pool.starmap(tibidam, [(..., foo_dyn, i)
for i in range(4)])
return foo_dyn
Спасибо всем за помощь ! :>