Nicht blockierende Lesevorgänge auf Subprozess-Pipes in Python
Subprozess-Pipes bieten eine Möglichkeit, mit externen Programmen aus Python heraus zu kommunizieren. Das Lesen aus der Standardausgabe blockiert jedoch standardmäßig den Vorgang, bis Daten verfügbar sind. Für Anwendungen, die nicht blockierende Lesevorgänge erfordern, sind mehrere Ansätze zu berücksichtigen.
Vermeiden Sie fcntl, select und asyncproc
Obwohl allgemein empfohlen, fcntl, select und asyncproc ist für dieses Szenario möglicherweise nicht geeignet. fcntl und select erfordern plattformspezifischen Code, während asyncproc auf Multiprocessing angewiesen ist, was zusätzlichen Overhead verursachen und schlecht mit Pipes interagieren kann.
Warteschlangenbasierte Lösung
Eine zuverlässige Eine tragbare Lösung besteht darin, einen Queue.get_nowait()-Aufruf zu verwenden. So funktioniert es:
from queue import Queue, Empty from subprocess import PIPE, Popen from threading import Thread # Initialize a subprocess and a queue for output p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1) q = Queue() # Create a thread to enqueue output from the subprocess t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start() # Read the queue in a non-blocking manner try: line = q.get_nowait() except Empty: print('No output yet') else: # ... process the output line
Bei diesem Ansatz wird ein separater Thread verwendet, um die Ausgabe des Unterprozesses in die Warteschlange einzureihen. Der Hauptprozess kann dann versuchen, Daten aus der Warteschlange abzurufen, ohne ihn zu blockieren. Wenn die Warteschlange leer ist, wird eine leere Ausnahme zurückgegeben.
Diese Lösung ist sowohl portierbar als auch effizient und ermöglicht nicht blockierende Lesevorgänge auf Unterprozess-Pipes, ohne dass plattformspezifischer Code oder zusätzliche Abhängigkeiten erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie kann ich nicht blockierende Lesevorgänge aus Subprozess-Pipes in Python erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!