Czy mogę utworzyć wspólny obiekt multiarray lub lists of lists w Pythonie do przetwarzania wieloprocesorowego?

Muszę zrobić wspólny obiekt wielowymiarowej tablicy lub listy list, aby był dostępny dla innych procesów. Czy istnieje sposób, aby go stworzyć, ponieważ to, co widziałem, nie jest możliwe. Próbowałem:

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

Słyszałem, że tablica numpy może być multiarray i obiektem współdzielonym, jeśli powyższe nie jest możliwe, czy ktoś może mi powiedzieć, jak zrobić tablicę numpy obiektem współdzielonym??

Author: user1249212, 2012-03-17

2 answers

Aby tablica numpy stała się obiektem współdzielonym (Pełny przykład):

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

Jeśli nie potrzebujesz shared (jak w "share the same memory") i wystarczy zwykły obiekt, który może być używany z wielu procesów, możesz użyć 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]]

From the docs:

Menedżerowie procesów serwera są bardziej elastyczni niż korzystanie z pamięci współdzielonej obiekty, ponieważ mogą być wykonane do obsługi dowolnych typów obiektów. Ponadto pojedynczy menedżer może być współdzielone przez procesy na różnych Komputery przez sieć. Są jednak wolniejsze niż korzystanie ze współdzielonych pamięć.

 27
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:57

Dlaczego nie utworzyć listy Array s?

 arrays = [Array('i', range(10))] * 10
 1
Author: Lev Levitsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-17 22:18:55