Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich in Python nicht blockierende Lesevorgänge aus dem Ausgabestream eines Unterprozesses durchführen?

Wie kann ich in Python nicht blockierende Lesevorgänge aus dem Ausgabestream eines Unterprozesses durchführen?

DDD
DDDOriginal
2024-12-17 22:06:12178Durchsuche

How Can I Perform Non-Blocking Reads from a Subprocess's Output Stream in Python?

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!

Stellungnahme:
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