0

Ich versuche, eine gemeinsam genutzte Variable (numpy Array in einem Namespace) zu aktualisieren, wenn Sie das Multiprocessing-Modul verwenden. Die Variable wird jedoch nicht aktualisiert und ich verstehe nicht warum.Multiprocessing freigegebene Variable nicht aktualisieren

Hier ist ein Beispielcode dies zu verdeutlichen:

from multiprocessing import Process, Manager 
import numpy as np 

chunk_size = 15 
arr_length = 1000 
jobs = [] 
namespace = Manager().Namespace() 
namespace.arr = np.zeros(arr_length) 
nb_chunk = arr_length/chunk_size + 1 


def foo(i, ns): 
    from_idx = chunk_size*i 
    to_idx = min(arr_length, chunk_size*(i+1)) 
    ns.arr[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) 

for i in np.arange(nb_chunk): 
    p = Process(target=foo, args=(i, namespace)) 
    p.start() 
    jobs.append(p) 
for i in np.arange(nb_chunk): 
    jobs[i].join() 

print namespace.arr[:10] 

Antwort

0

Das Problem ist, dass das Manager().Namespace() Objekt nicht bemerkt dass Sie alles ändern, indem Sie ns.arr[from_idx:to_idx] = ... verwenden (da Sie an einer inneren Datenstruktur arbeiten) und sich daher nicht auf die anderen Prozesse ausbreiten.

This answer erklärt sehr gut, was hier vor sich geht.

es zu beheben, erstellen Sie die Liste als Manager().List() und diese Liste an die Prozesse übergeben, so dass ns[from_idx:to_idx] = ... als Änderung erkannt wird und auf die Prozesse propagiert:

from multiprocessing import Process, Manager 
import numpy as np 

chunk_size = 15 
arr_length = 1000 
jobs = [] 
arr = Manager().list([0] * arr_length) 

nb_chunk = arr_length/chunk_size + 1 


def foo(i, ns): 
    from_idx = chunk_size*i 
    to_idx = min(arr_length, chunk_size*(i+1)) 
    ns[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) 

for i in np.arange(nb_chunk): 
    p = Process(target=foo, args=(i, arr)) 
    p.start() 
    jobs.append(p) 
for i in np.arange(nb_chunk): 
    jobs[i].join() 

print arr[:10] 
1

Sie können Objekte nicht teilen in-built wie list, dict über Prozesse in Python. Um Daten zwischen Prozess zu teilen, bieten Python's multiprocessing zwei Datenstruktur:

Lesen Sie auch: Exchanging objects between processes

+0

ok, aber wie konnte ich Vorteil, dass ich in jedem Prozess nicht auf den gleichen Speicherplatz des Arrays zugreifen kann? – GuillaumeA

+0

Ähnlich wie Ihr aktueller Code, indem Sie sie als Argument an die Funktion übergeben ('foo()' in Ihrem Fall). Sie können [Mehrere asynchrone Funktionen ausführen und den zurückgegebenen Wert jeder Funktion abrufen] (http://stackoverflow.com/questions/40536287/running-multiple-asynchronous-function-and-get-the-returned-value-of-of- jedes-functi), die Frage, die ich in der Vergangenheit gestellt habe. Es hat eine Antwort mit der Verwendung von "Warteschlange" –

Verwandte Themen