Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich nicht blockierende Lesevorgänge aus Subprozess-Pipes in Python erreichen?

Wie kann ich nicht blockierende Lesevorgänge aus Subprozess-Pipes in Python erreichen?

DDD
Freigeben: 2024-12-19 13:55:11
Original
769 Leute haben es durchsucht

How Can I Achieve Non-Blocking Reads from Subprocess Pipes in Python?

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage