2017-08-22 4 views
1

Ich versuche, eine einfache Anordnung in einer einfachen for Schleife zu ändern. Da für meine Anwendung ein einzelner Thread ein Flaschenhals zu sein scheint, entschied ich mich, die Pythons Multiprocessing API zu betrachten. Es sieht jedoch so aus, als ob ich ein numpiges Array nicht gleichzeitig ändern kann, obwohl ich nur jedes Element nur einmal modifiziere. Werfen Sie einen Blick auf dieses Beispiel-Code:numpy Arrays arbeiten nicht mit Python Multiprocessing

Import numpy als np Import Multiprozessing

arrlen = 3 
arr = np.zeros(arrlen) 


def func(x): 
    arr[x] = 1 


for i in range(arrlen): 
    func(i) 

print(arr) 

Das ist alles schön und gut, und ich bekomme [1.0, 1.0, 1.0] als Ergebnis wie erwartet. Aber sobald ich die for-Schleife durch pool.map ersetze, funktioniert es nicht.

pool = multiprocessing.Pool() 
pool.map(func, range(arrlen)) 

ich mit dem PyCharm Debugger überprüft, Func wird tatsächlich mit den richtigen Argumenten, aber das zweite Beispiel druckt [0.0, 0.0, 0.0] genannt. Irgendwelche Ideen warum? Irgendwelche Ideen, wie ich dieses Problem umgehen kann?

+2

Arbeitsprozesse haben keinen Zugriff auf die Objekte des Masters. Sie bekommen höchstens Kopien und manchmal nicht einmal das. Du arbeitest an Kopien. – user2357112

+0

@ user2357112 Würde das bedeuten, dass sie unterschiedliche IDs haben? Weil die IDs gleich sind. – Distjubo

+2

IDs sind nur innerhalb eines Prozesses von Bedeutung. Objekte in verschiedenen Prozessen können dieselbe ID haben. – user2357112

Antwort

0

wenn Multi Verarbeitung, jeder Thread Sie empfängt in seinem eigenen Rahmen Prozesse Objekte laichen.

Ihre Funktion muss einen Wert zurückgeben, und dann müssen Sie diese in Ihrem globalen Array aggregieren.

Der erzeugte Thread kann nicht das globale Array zugreifen. so

def func(x): 
    return = 1 

dann

arr = np.array(pool.map(func, range(arrlen))) 

tun würde, was Sie wollen.

Verwandte Themen