Как заполнить массивы в разных процессах
Мне нужно вывести сложные расчеты массивов в разные процессы. Но у меня не получается получить доступ к массиву в самой функции процесса. Можно подробнее, как это сделать.
from multiprocessing import Process
import numpy as np
nambers = [1, 2]
a1 = []
a2 = []
print(a1, a2)
def print_func(namber):
if namber == 1:
a1 = np.random.random(50)
if namber == 2:
a2 = np.random.random(50)
procs = []
for namber in nambers:
proc = Process(target=print_func, args=(namber,))
procs.append(proc)
proc.start()
for proc in procs:
proc.join()
print('после', a1, a2)
P.S. Всем спасибо за ответы! От себя добавлю, как решение ниже, код с использованием очередей:
from multiprocessing import Process, Queue
import numpy as np
a1 = []
a2 = []
print('до', a1, a2)
def print_func(q):
q.put(np.random.random(50))
procs = []
for i in range(0, 2):
q = Queue()
proc = Process(target=print_func, args=(q, ))
procs.append(proc)
proc.start()
if i == 0:
a1 = q.get()
if i == 1:
a2 = q.get()
for proc in procs:
proc.join()
print('после', a1, a2)
Ответы (1 шт):
Автор решения: asanisimov
→ Ссылка
Для синхронизации между процессами можно использовать объект Manager.
from multiprocessing import Process, Manager
import numpy as np
def print_func(namber):
global first_array
global second_array
if namber == 1:
a1 = np.random.random(50)
first_array += a1
if namber == 2:
a2 = np.random.random(50)
second_array += a2
if __name__ == '__main__':
procs = []
with Manager() as manager:
first_array = manager.list()
second_array = manager.list()
numbers = [1, 2]
for number in numbers:
proc = Process(target=print_func, args=(number,))
procs.append(proc)
proc.start()
for proc in procs:
proc.join()
print(first_array)
print(second_array)
Тут вы регистрируете менеджер with Manager() as manager: и создаете 2 массива к которым можно будет обращаться из любого процесса. Это лишь один из вариантов, подробнее в документации. Но в вашем случае это кажется излишнем, правильнее, на мой взгляд, будет вернуть значение из процесса.