Могу ли я создать общий многоадресный или список объектов списка в python для многопроцессорности?

Мне нужно сделать общий объект многомерного массива или список списков, чтобы он был доступен другим процессам. Есть ли способ создать его, поскольку то, что я видел, невозможно. Я пробовал:

from multiprocessing import Process, Value, Array
arr = Array('i', range(10))
arr[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr[2]=[12,43]
TypeError: an integer is required

Я слышал, что массив numpy может быть multiarray и shared object, если выше не возможно, может кто-нибудь сказать мне, как сделать массив numpy общим объектом?

2 ответа

Чтобы сделать массив numpy общим объектом (полный пример):

import ctypes as c
import numpy as np
import multiprocessing as mp
n, m = 2, 3
mp_arr = mp.Array(c.********, n*m) # shared, can be used from multiple processes
# then in each new process create a new numpy array using:
arr = np.frombuffer(mp_arr.get_obj()) # mp_arr and arr share the same memory
# make it two-dimensional
b = arr.reshape((n,m)) # b and arr share the same memory

Если вам не нужен общий (как в "share the same memory" ) объект, а простой объект, который можно использовать из нескольких процессов, достаточно, вы можете использовать multiprocessing.Manager:

from multiprocessing import Process, Manager
def f(L): row = L[0] # take the 1st row row.append(10) # change it L[0] = row #NOTE: important: copy the row back (otherwise parent #process won't see the changes)
if __name__ == '__main__': manager = Manager() lst = manager.list() lst.append([1]) lst.append([2, 3]) print(lst) # before: [[1], [2, 3]] p = Process(target=f, args=(lst,)) p.start() p.join() print(lst) # after: [[1, 10], [2, 3]]

От документы:

Менеджеры процессов сервера более гибкие, чем использование разделяемой памяти потому что они могут быть созданы для поддержки произвольных типов объектов. Кроме того, один менеджер может совместно использоваться процессами на разных компьютеров по сети. Они, однако, медленнее, чем использование общих память.


Почему бы не создать список Array s?

arrays = [Array('i', range(10))] * 10

licensed under cc by-sa 3.0 with attribution.