Как заполнить массивы в разных процессах

Мне нужно вывести сложные расчеты массивов в разные процессы. Но у меня не получается получить доступ к массиву в самой функции процесса. Можно подробнее, как это сделать.

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 массива к которым можно будет обращаться из любого процесса. Это лишь один из вариантов, подробнее в документации. Но в вашем случае это кажется излишнем, правильнее, на мой взгляд, будет вернуть значение из процесса.

→ Ссылка