python-multiprocessing-pool beenden

Arbeite ich auf einer renderfarm, und ich brauche meine Kunden, um in der Lage zu starten mehrerer Instanzen eines Renderers, ohne zu blockieren, so kann der Kunde erhalten neue Befehle. Ich habe, dass die Arbeit richtig, aber ich habe Probleme mit dem beenden der Prozesse erstellt.

Auf globaler Ebene definiere ich mein pool (so dass ich zugreifen kann, können Sie aus jeder Funktion):

p = Pool(2)

Ich dann meinen renderer mit apply_async:

for i in range(totalInstances):
    p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()

Dass die Funktion abgeschlossen ist, startet die Prozesse im hintergrund, und wartet auf neue Befehle. Ich habe einen einfachen Befehl, töten den client und stoppen Sie die macht:

def close():
'close this client instance'
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
    p.terminate()
except Exception,e:
    print str(e)
    sys.exit()
sys.exit()

Scheint es nicht zu geben einen Fehler (es drucken würde, der den Fehler), die python beendet, aber der hintergrund-Prozesse ausgeführt werden. Kann jemand empfehlen, einen besseren Weg, die Kontrolle dieser Programme gestartet?

  • Versuchen, aktivieren Sie die debug-Protokollierung mit from multiprocessing import util; util.get_logger().setLevel(util.DEBUG) und fügen Sie die Ausgabe.
  • Ich habe gesehen, Verhalten, wie dies vor, aber kann es nicht reproduzieren...jetzt Frage ich mich, wenn ein Aufruf von p.join() helfen würde, nach dem Aufruf von p.terminate()? Ich Frage mich auch, wenn Sie noch brauchen, um Anruf zu beenden und wenn Sie nur das tut, sys.exit() wird ordnungsgemäß Müll sammeln, den Pool und alle seine Prozesse.
  • wenn ich versuche zum aktivieren der Protokollierung, ich bin immer dies in der Konsole:" Kein Handler gefunden werden konnte, der für den logger "multiprocessing". Leider, p.join() nach p.terminate() nicht einen Unterschied machen, und sys.exit() schließt die python lässt aber die Prozesse im hintergrund laufen.
  • versuchen multiprocessing.log_to_stderr().setLevel(logging.DEBUG). Tut render() starten weiterer Prozesse, z.B. mit subprocess Modul?
InformationsquelleAutor tk421storm | 2013-05-06
Schreibe einen Kommentar