2017-09-29 1 views
0

Ich habe Dutzende der "Python Subprozess hängt" -Artikel hier und denke, ich habe alle Probleme in den verschiedenen Artikeln in dem Code unten angesprochen adressiert.Python-Subprozess hängt als Popen beim Piping-Ausgabe

Mein Code hängt zeitweise beim Popen-Befehl. Ich verwende 4 Threads mit multiprocessing.dummy.apply_async, jeder dieser Threads startet einen Subprozess und liest dann die Ausgabe Zeile für Zeile und druckt eine modifizierte Version davon auf stdout.

def my_subproc(): 
    exec_command = ['stdbuf', '-i0', '-o0', '-e0', 
        sys.executable, '-u', 
        os.path.dirname(os.path.realpath(__file__)) + '/myscript.py'] 

    proc = subprocess.Popen(exec_command, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1) 
    print "DEBUG1", device 

    for line in iter(proc.stdout.readline, b''): 
    with print_lock: 
     for l in textwrap.wrap(line.rstrip(), LINE_WRAP_DEFAULT): 

Der obige Code von apply_async ausgeführt wird:

pool = multiprocessing.dummy.Pool(4) 
for i in range(0,4): 
    pool.apply_async(my_subproc) 

Intermittently der Subprozess bei subprocess.Popen, wird die Anweisung "debug1" hängen wird nicht gedruckt. Manchmal funktionieren alle Threads, manchmal nur 1 von 4.

Ich bin mir nicht bewusst, dass dies eine der bekannten Deadlock-Situationen für Popen zeigt. Liege ich falsch?

Antwort

0

Dies scheint eine schlechte Interaktion mit multiprocessing.dummy zu sein. Wenn ich Multiprocessing (nicht die .dummy Threading-Schnittstelle) verwende, kann ich den Fehler nicht reproduzieren.