Могу ли я создать общий многомерный массив или списки объектов списков в Python для многопроцессорной обработки? - PullRequest
11 голосов
/ 18 марта 2012

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

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 может быть многомерным и совместно используемым объектом, если описанное выше невозможно, может кто-нибудь сказать мне, как сделать массив NUMPY общим объектом ??

Ответы [ 2 ]

23 голосов
/ 18 марта 2012

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

import ctypes as c
import numpy as np
import multiprocessing as mp

n, m = 2, 3
mp_arr = mp.Array(c.c_double, 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

Если вам не нужен shared (как в "share")достаточно одного и того же объекта памяти ") и простого объекта, который можно использовать в нескольких процессах, тогда вы можете использовать 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]]

Из документов :

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

2 голосов
/ 18 марта 2012

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

 arrays = [Array('i', range(10))] * 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...