Nicht blockierende Lesevorgänge für die Standardausgabe von Unterprozessen
Wenn Sie das Unterprozessmodul verwenden, um Unterprozesse zu initiieren und eine Verbindung zu ihren Standardausgabeströmen herzustellen, ist dies der Fall Dies ist für die Durchführung nicht blockierender Lesevorgänge unerlässlich, um die Reaktionsfähigkeit des Programms aufrechtzuerhalten. Dieser Artikel befasst sich mit Techniken, um nicht blockierende Lesevorgänge auf Standardausgaben von Unterprozessen zu erreichen oder die Datenverfügbarkeit vor dem Aufruf von .readline zu bewerten.
Traditioneller Blockierungsansatz
Lesen Sie normalerweise weiter Die Standardausgabe blockiert, d. h. die Ausführung wird angehalten, bis Daten verfügbar sind. Dies wird unten demonstriert:
import subprocess p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()
Bei diesem Ansatz wird die Ausführung jedoch ins Stocken geraten, wenn keine Daten sofort im Stream vorhanden sind.
Blockierende Lesevorgänge mit Queue.get_nowait überwinden ()
Um blockierende Lesevorgänge zu umgehen, besteht ein zuverlässiger plattformübergreifender Ansatz darin, das Queue-Modul und seine Funktionen zu verwenden get_nowait()-Methode. Diese Methode geht elegant mit dem Fehlen von Daten im Stream um und ermöglicht nicht blockierende Lesevorgänge:
import sys from subprocess import PIPE, Popen from threading import Thread from queue import Queue, Empty ON_POSIX = 'posix' in sys.builtin_module_names def enqueue_output(out, queue): for line in iter(out.readline, b''): queue.put(line) out.close() p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX) q = Queue() t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True # thread dies with the program t.start() try: line = q.get_nowait() except Empty: print('no output yet') else: # got line # ... do something with line
Bei diesem Ansatz wird ein separater Thread erzeugt, um die Ausgabe der Standardausgabe des Unterprozesses kontinuierlich in die Warteschlange einzureihen. Der Hauptthread kann dann nicht blockierende Lesevorgänge durchführen, indem er get_nowait() aufruft. Wenn die Warteschlange leer ist, kehrt der Aufruf ohne Blockierung zurück, sodass der Hauptthread fortfahren kann.
Das obige ist der detaillierte Inhalt vonWie kann ich nicht blockierende Lesevorgänge aus der Standardausgabe eines Unterprozesses erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!