Teilprozess.wait() wartet nicht auf Popen Prozess zu beenden (bei der Verwendung von threads)?

Ich bin erleben einige Probleme bei der Verwendung von subprocess.Popen() zum laichen mehrere Instanzen der gleichen Anwendung aus meinem python-Skript mit threads zu haben, die Sie gleichzeitig laufen. In jedem thread habe ich die Anwendung ausführen, mit der popen() rufen, und dann muss ich warten, bis es zu beenden durch Aufrufwait(). Das problem scheint zu sein, dass die wait()-Aufruf nicht eigentlich warten, bis der Prozess abgeschlossen ist. Ich experimentierte mit nur einem thread, und durch das drucken von text-Nachrichten, wenn der Prozess beginnt, und Wann es beendet ist. Also die thread-Funktion würde wie folgt Aussehen:

def worker():
    while True:
        job = q.get() # q is a global Queue of jobs
        print('Starting process %d' % job['id'])
        proc = subprocess.Popen(job['cmd'], shell=True)
        proc.wait()
        print('Finished process %d' % job['id'])
        job.task_done()

Aber selbst wenn ich nur ein thread, es gibt mehrere "Starten..." - Nachrichten, bevor irgendwelche "Fertig-Prozess..." - Meldung erscheint. Gibt es Fälle, wenn wait() eigentlich nicht warten? Ich habe mehrere verschiedene externe Anwendungen (C++ - Konsolenanwendungen), die wiederum mehrere Instanzen gleichzeitig laufen, und für einige von Ihnen, mein code funktioniert, aber für andere ist es nicht. Könnte es sein, einige Problem mit der externen Anwendungen, die irgendwie wirkt der Aufruf wait()?
Der code für das erstellen des threads so aussieht:

for i in range(1):
    t = Thread(target=worker)
    t.daemon = True
    t.start()
q.join() # Wait for the queue to empty

Update 1:
Ich sollte auch hinzufügen, dass für manche der externen Anwendungen manchmal bekomme ich einen Rückgabewert (proc.returncode) -1073471801. Zum Beispiel, eine der externen Anwendungen geben, dass der return-code die ersten beiden Male Popen genannt wird, aber nicht die letzten zwei (wenn ich vier jobs).

Update 2:
Klar, die Dinge bis jetzt habe ich vier jobs in der Warteschlange, das sind vier verschiedene Testfälle. Wenn ich meinen code für eines der externen Anwendungen die ersten zwei Popen-Anrufe generieren, die die Rückkehr-code -1073471801. Aber wenn ich drucken Sie die genauen Befehl, die Popen Anrufe, und führen Sie es in einem command-Fenster hat, führt er ohne jegliche Probleme.

Gelöst!
Ich schaffte es um die Probleme zu lösen, die ich hatte. Ich denke, das problem war meine mangelnde Erfahrung in der Thread-Programmierung. Ich vermisste die Tatsache, dass, wenn ich hatte meine erste worker-threads, würden Sie weiterleben, bis Sie das python-Skript beendet. Versehentlich habe ich mehr worker-threads jedes mal, wenn ich neue Elemente in der Warteschlange (ich weiß, dass in den Reihen für jedes externe Programm, das ich ausführen will). So durch die Zeit habe ich im vierten externen Anwendung, hatte ich vier threads gleichzeitig ausführen, obwohl ich nur dachte, ich hatte eine.

InformationsquelleAutor der Frage iceaway | 2011-06-14

Schreibe einen Kommentar