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
Freigeben: 2024-12-17 22:06:12
Original
182 Leute haben es durchsucht

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

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

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

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

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!

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