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??
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ęć.
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
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