Nicht blockierende Lesevorgänge für Subprozess-Ausgabestreams in Python
In Python bietet das Subprozessmodul eine bequeme Möglichkeit zum Starten und Interagieren mit externen Prozesse. Es ist jedoch von entscheidender Bedeutung, die E/A-Interaktionen zwischen den übergeordneten und untergeordneten Prozessen effizient abzuwickeln.
Stellen Sie sich das folgende Szenario vor: Sie möchten nicht blockierende Lesevorgänge für den Standardausgabestream eines Unterprozesses durchführen. Standardmäßig blockiert p.stdout.readline(), bis Daten im Puffer verfügbar sind. Um dieses Problem zu lösen, können wir eine Technik anwenden, die einen separaten Thread und eine Warteschlange umfasst.
Erstellen Sie zunächst eine Warteschlange zum Speichern von Ausgabezeilen:
from Queue import Queue
Als nächstes starten Sie einen Thread, der liest Zeilen aus dem Unterprozess stdout und stellt sie in die Warteschlange:
def enqueue_output(out, queue): for line in iter(out.readline, b''): queue.put(line) out.close()
Initialisieren Sie den Unterprozess und starten Sie den Thread:
p = Popen(['myprogram.exe'], stdout=PIPE) q = Queue() t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start()
Um eine Zeile nicht blockierend zu lesen, verwenden Sie Folgendes:
try: line = q.get_nowait() # or q.get(timeout=.1) except Empty: print('no output yet') else: # got line # do something with the line
Diese Methode ist plattformübergreifend kompatibel und gewährleistet nicht blockierende Lesevorgänge, sodass Sie effizient lesen können Prozessdaten aus dem Unterprozess.
Das obige ist der detaillierte Inhalt vonWie kann ich in Python nicht blockierende Lesevorgänge aus dem Ausgabestream eines Unterprozesses durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!