Python-multiprocessing für parallele Prozesse
Tut mir Leid wenn das zu einfach für einige Leute, aber ich verstehe immer noch nicht den trick mit python-multiprocessing. Ich habe gelesen
http://docs.python.org/dev/library/multiprocessing
http://pymotw.com/2/multiprocessing/basics.html
und viele andere tutorials und Beispiele, die google mir gibt,... viele von Ihnen von hier aus zu.
Gut, meine situation ist die, dass ich haben, um zu berechnen, viele numpy-Matrizen, und ich brauche, um Sie zu speichern in einer einzigen numpy matrix hinterher. Sagen wir, ich will mit 20 cores (oder, dass ich 20 Kerne) aber ich habe es nicht geschafft, erfolgreich in den pool Ressource, da es hält die Prozesse am Leben, bis der pool "stirbt". Also ich dachte an sowas:
from multiprocessing import Process, Queue
import numpy as np
def f(q,i):
q.put( np.zeros( (4,4) ) )
if __name__ == '__main__':
q = Queue()
for i in range(30):
p = Process(target=f, args=(q,))
p.start()
p.join()
result = q.get()
while q.empty() == False:
result += q.get()
print result
aber dann sieht es aus wie die Prozesse laufen nicht parallel, sondern Sie laufen nacheinander (bitte korrigiert mich wenn ich falsch Liege) und ich weiß nicht, ob Sie sterben, nachdem Sie Ihre Berechnung (also für mehr als 20 Prozesse, die diejenigen, die haben Ihren Teil verlassen Sie den Kern frei für einen anderen Prozess). Plus, für eine sehr große Anzahl (sagen wir 100.000), speichern alle diese Matrizen einen (wirklich groß) in eine Warteschlange verwenden eine Menge Speicher, die rendering-code nutzlos ist, da die Idee ist, jedes Ergebnis bei jeder iteration in der letzten Folge, wie Sie mit einem Schloss (und seinem Erwerb() und release () - Methoden), aber wenn dieser code nicht für die parallele Verarbeitung, die Sperre ist nutzlos...
Ich hoffe, jemand kann mir helfen.
Vielen Dank im Voraus!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig, Sie sind ausgeführt sequentiell in deinem Beispiel.
p.join()
wird der aktuelle thread blockiert, bis es fertig ist die Ausführung. Sie werden entweder beitreten wollen Ihre Prozesse individuell außerhalb deiner for-Schleife (z.B. durch Speicherung in einer Liste und dann iteriert es) oder so etwas wienumpy.Pool
undapply_async
mit einem Rückruf. Das wird auch lassen Sie es hinzufügen, um Ihre Ergebnisse direkt, statt die Objekte herum.Beispiel:
Schließen und dann den Beitritt der pool am Ende sorgt dafür, dass der pool, die die Prozesse abgeschlossen haben und die
result
Objekt fertig berechnet. Man könnte auch untersuchen, mitPool.imap
als eine Lösung für Ihr problem. Dass insbesondere die Lösung würde wie folgt Aussehen:Dieser Reiniger ist für Ihre spezifische situation, kann aber nicht sein, für was auch immer Sie letztlich versuchen, zu tun.
Als zu speichern Sie alle Ihre unterschiedliche Ergebnisse, wenn ich Ihre Frage zu verstehen, können Sie fügen Sie es einfach aus-das Ergebnis in eine in der callback-Methode (wie oben) oder Artikel-at-a-time mit
imap
/imap_unordered
(was immer das Ergebnis speichert, aber du wirst es klar, wie es baut). Dann ist es nicht aufbewahrt werden müssen, länger als es braucht, um hinzuzufügen, um das Ergebnis.Pool
oder der Suche nach einem Ersatz, es sei denn, Sie haben tatsächlich profiling-Daten anzeigt, dass es ein problem ist. Es gibt Optimierungen Sie machen können, aber bis Sie die demonstration, dass es ein problem im realen system die meisten von Ihnen sind nicht Wert die Mühe.