Процессы не делятся памятью, ваша программа изначально создаст массив, полный нулей, а затем запустит 10 процессов, которые вызовут функцию func на копии массива, когда он был впервые создан, но никогда не будет оригинального массива.
Похоже, что вы на самом деле пытаетесь достичь это:
from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Array
def modify_array(index, sharedarray):
sharedarray[index] = index ** 2
print([x for x in sharedarray])
def main(n):
lock = Lock()
array = Array('i', 10, lock=lock)
if __name__ == '__main__':
for i in range(0, n):
p = Process(target=modify_array, args=(i, array))
p.start()
p.join()
return list(array)
main(10)
Выход:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 4, 9, 0, 0, 0, 0, 0, 0]
[0, 1, 4, 9, 16, 0, 0, 0, 0, 0]
[0, 1, 4, 9, 16, 25, 0, 0, 0, 0]
[0, 1, 4, 9, 16, 25, 36, 0, 0, 0]
[0, 1, 4, 9, 16, 25, 36, 49, 0, 0]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 0]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Но проблема в том, используя мультипроцессирование ошибочна. Существует множество накладных расходов на создание дополнительного процесса, по сравнению с новым потоком или даже просто однопоточность и использование цикла событий для запуска действий.
Пример использования параллелизма в однопоточном, едином процессе Python может выглядеть следующим образом:
import numpy as np
from asyncio import get_event_loop, wait, ensure_future
def modify_array(index, array):
array[index] = index ** 2
print([x for x in array])
async def task(loop, function, index, array):
await loop.run_in_executor(None, function, index, array)
def main(n):
loop = get_event_loop()
jobs = list()
array = np.zeros(10)
for i in range(0, n):
jobs.append(
ensure_future(
task(loop, modify_array, i, array)
)
)
loop.run_until_complete(wait(jobs))
loop.close()
main(10)
Это популярный шаблон в эти дни, использование asyncio события петель для выполнения задач в параллельны друг другу.Однако, поскольку вы используете библиотеку, такую как Numpy, я задаю вопрос, насколько ценен этот шаблон для вас.
От [this post] (http://stackoverflow.com/a/15858559/1636276): «Проблема в том, что когда объекты передаются рабочим процессам, они упаковываются с рассолом, отгружаются в другой процесс, где они распаковываются и обрабатываются. Ваши объекты не столько передаются другому процессу, сколько клонированы ». – Tagc