2012-04-06 13 views
0

Ich habe ein Programm mit Python Multiprocessing. Ich finde, dass der gesamte Prozess, der in den Hauptprogrammen erstellt wurde, beendet werden kann, aber das Hauptprogramm immer auf die Rückgabewerte wartet und nicht aufhören kann. Kann mir jemand Vorschläge machen, wie ich dieses Problem lösen kann?Prozess kann nicht in Python Multiprocessing-Pool stoppen

Die Code-Schnipsel ist wie folgt:

Hauptprogramm:

workers = multiprocessing.Pool(4) 
args = [arg1, arg2, arg3, arg4] 
results = workers.map(subfunc, args) 
print "we are in main functions " 

subfunc (* arg)

# doing some other jobs 
result = {.....} # a large dictionary 
print 'done with sub functions' 
return result # if I change it to "return 1", it can finish successfully 

ich die Ausgabe für alle "mit Unterfunktionen done" sehen die in main angelegten Prozesse, aber keine Ausgaben "Wir sind in Hauptfunktionen". Kann mir jemand helfen, das Problem herauszufinden?

+2

Können Sie testen, um zu entsprechen, dass die Ergebnisse eine Länge haben? Dieses Verhalten kann dazu führen, dass die Schleife nie ausgeführt wird. – mklauber

+0

Es kann sein, dass das Ergebniswörterbuch rekursive Referenzen hat und es nicht zu einem Pickle wird. Versuchen Sie, es zu schreiben, um als Essiggurke oder Json auszugeben. – j13r

+0

Das habe ich gerade gemacht und es funktioniert. Danke – hanqiang

Antwort

2

Nachdem subfunc das Ergebnis zurückgibt, muss der untergeordnete Prozess das Ergebnis noch einfrieren und über die Interprozesskommunikation an den Masterprozess senden. Sie drucken also "fertig", bevor der Subprozess tatsächlich beendet werden kann.

Sie könnten versuchen, einfach "fake" zurückgeben, um sicherzustellen, dass das das Problem ist, und dann über Möglichkeiten nachdenken, die Ergebnisse zwischen den Prozessen schneller zu kommunizieren. Abhängig vom Inhalt Ihrer Liste können Sie beispielsweise die Inhalte in einem engeren Format verpacken, oder geteilter Speicher ist eine praktikable Option.

+0

Wenn ich "1" in subfunc zurückgebe, kann das Hauptprogramm erfolgreich beenden. Also im Moment denke ich, dass dieses Problem durch die Größe des zurückgegebenen Wertes verursacht werden kann. In meinem Programm kann der zurückgegebene Wert von Subfunc so groß wie 1 GB sein. Wie denkst du darüber? – hanqiang

+0

@hanqiang Ja, das ist es wahrscheinlich dann. Was für Daten sind das? Wahrscheinlich möchten Sie es vom Worker zum Master auf eine andere Art und Weise kommunizieren, vielleicht über den Shared Memory, eine [memory-mapped file] (http://docs.python.org/library/mmap.html), eine Datenbank, einfache alte Datei-I/O, etwas. – Dougal

+0

Wow ... Ich verbrachte Stunden damit herauszufinden, warum meine Kinderprozesse mir sagten, dass sie fertig waren, aber die Dinge schienen scheinbar nur zu frieren. Es stellte sich heraus, dass dieses Beizen passierte und ich einfach warten musste. – CodeGuyRoss