python-multiprocessing - Prozess hängt mitmachen für große Warteschlange
Ich bin mit python 2.7.3 und mir ist aufgefallen das Folgendes merkwürdige Verhalten. Betrachten Sie dieses minimal-Beispiel:
from multiprocessing import Process, Queue
def foo(qin, qout):
while True:
bar = qin.get()
if bar is None:
break
qout.put({'bar': bar})
if __name__ == '__main__':
import sys
qin = Queue()
qout = Queue()
worker = Process(target=foo,args=(qin,qout))
worker.start()
for i in range(100000):
print i
sys.stdout.flush()
qin.put(i**2)
qin.put(None)
worker.join()
Wenn ich den loop über die 10.000 oder mehr, mein Skript hängt sich auf worker.join()
. Es funktioniert gut, wenn die Schleife geht nur bis 1.000.
Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
qout
Warteschlange im Teilprozess voll ist. Die Daten, die Sie in Sie setzen ausfoo()
passt nicht in den Puffer des OS ' s pipes intern verwendet, so dass der Teilprozess Blöcke versuchen, passen mehr Daten. Aber der parent-Prozess ist nicht das Lesen dieser Daten: es ist einfach blockiert zu, warten für den Unterprozess zu beenden. Dies ist ein typischer deadlock.Muss es eine Grenze für die Größe von Warteschlangen. Betrachten Sie die folgende änderung:
Dieser Werke, wie Sie sind (mit
qout.put
Zeile auskommentiert). Wenn Sie versuchen, speichern Sie alle 100000 Ergebnisse, dannqout
zu groß wird: wenn ich entfernen Sie die Kommentarzeichen aus derqout.put({'bar':bar})
imfoo
, und lassen die definition vonqout
in POSITION 1, wird der code hängt sich auf. Wenn ich jedoch verschiebenqout
definition auf POSITION 2, dann beendet sich das Skript.Also kurz gesagt, Sie müssen vorsichtig sein, dass weder
qin
nochqout
zu groß wird. (Siehe auch: Multiprocessing Queue maxsize-limit ist 32767)Ich hatte das gleiche problem auf
python3
wenn er versucht wird, um strings in eine Warteschlange mit Gesamtgröße über 5000 cahrs.In meinem Projekt gab es einen host-Prozess, setzt eine Warteschlange und startet Unterprozess, dann verbindet. Afrer
join
host-Prozess liest form der Warteschlange. Wenn Teilprozess producess zu viel Daten, host-hungs aufjoin
. Ich fixierte diese mit der folgenden Funktion zu warten für den Teilprozess in der host-Prozess:Lese ich aus der Warteschlange aus, sobald es füllt also es wird nie sehr groß
Ich versuche zu
.get()
eine asynchrone worker, nachdem der pool geschlossen hatteEinrückung Fehler außerhalb der with-block
ich hatte dieses
ich brauchte in diesem