Heim > Backend-Entwicklung > Python-Tutorial > Wie erreicht man nicht blockierende Subprozess-Pipe-Lesevorgänge in Python?

Wie erreicht man nicht blockierende Subprozess-Pipe-Lesevorgänge in Python?

Linda Hamilton
Freigeben: 2024-12-17 05:30:25
Original
969 Leute haben es durchsucht

How to Achieve Non-Blocking Subprocess Pipe Reads in Python?

So führen Sie nicht blockierende Lesevorgänge für Subprozess-Pipes in Python durch

Bei der Arbeit mit dem Subprozessmodul in Python kann dies erforderlich sein Führen Sie nicht blockierende Lesevorgänge für den Ausgabestrom eines Unterprozesses durch. Dadurch wird sichergestellt, dass das Programm beim Lesen aus einem Prozess, für den möglicherweise keine Daten verfügbar sind, nicht blockiert.

Traditionelle blockierende Lesevorgänge

Typischerweise wäre der folgende Code Wird verwendet, um aus der Standardausgabe eines Unterprozesses zu lesen:

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Nach dem Login kopieren

Dieser Ansatz blockiert jedoch die Ausführung des Programms, bis Daten im Standard verfügbar sind Ausgabe.

Nicht blockierende Lesevorgänge

Um nicht blockierende Lesevorgänge zu implementieren, ist eine gängige Methode die Verwendung der Queue-Klasse aus dem Python-Warteschlangenmodul. Hier ist ein Beispiel:

import sys
from subprocess import PIPE, Popen
from threading  import Thread
try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

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()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line
Nach dem Login kopieren

In diesem Code wird die Funktion „enqueue_output“ in einem separaten Thread ausgeführt und die Ausgabe erfolgt im Unterprozess „stdout“.如果没有数据,它将引发 Leer异常,而如果成功,它将返回提取的行.

Das obige ist der detaillierte Inhalt vonWie erreicht man nicht blockierende Subprozess-Pipe-Lesevorgänge in Python?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage