Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich nicht blockierende Lesevorgänge aus der Standardausgabe eines Unterprozesses erreichen?

Wie kann ich nicht blockierende Lesevorgänge aus der Standardausgabe eines Unterprozesses erreichen?

Linda Hamilton
Freigeben: 2024-12-25 15:07:14
Original
263 Leute haben es durchsucht

How Can I Achieve Non-Blocking Reads from a Subprocess's Standard Output?

Nicht blockierende Lesevorgänge für die Standardausgabe von Unterprozessen

Wenn Sie das Unterprozessmodul verwenden, um Unterprozesse zu initiieren und eine Verbindung zu ihren Standardausgabeströmen herzustellen, ist dies der Fall Dies ist für die Durchführung nicht blockierender Lesevorgänge unerlässlich, um die Reaktionsfähigkeit des Programms aufrechtzuerhalten. Dieser Artikel befasst sich mit Techniken, um nicht blockierende Lesevorgänge auf Standardausgaben von Unterprozessen zu erreichen oder die Datenverfügbarkeit vor dem Aufruf von .readline zu bewerten.

Traditioneller Blockierungsansatz

Lesen Sie normalerweise weiter Die Standardausgabe blockiert, d. h. die Ausführung wird angehalten, bis Daten verfügbar sind. Dies wird unten demonstriert:

import subprocess

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

Bei diesem Ansatz wird die Ausführung jedoch ins Stocken geraten, wenn keine Daten sofort im Stream vorhanden sind.

Blockierende Lesevorgänge mit Queue.get_nowait überwinden ()

Um blockierende Lesevorgänge zu umgehen, besteht ein zuverlässiger plattformübergreifender Ansatz darin, das Queue-Modul und seine Funktionen zu verwenden get_nowait()-Methode. Diese Methode geht elegant mit dem Fehlen von Daten im Stream um und ermöglicht nicht blockierende Lesevorgänge:

import sys
from subprocess import PIPE, Popen
from threading  import Thread
from queue import Queue, Empty

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

try:  line = q.get_nowait()
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line
Nach dem Login kopieren

Bei diesem Ansatz wird ein separater Thread erzeugt, um die Ausgabe der Standardausgabe des Unterprozesses kontinuierlich in die Warteschlange einzureihen. Der Hauptthread kann dann nicht blockierende Lesevorgänge durchführen, indem er get_nowait() aufruft. Wenn die Warteschlange leer ist, kehrt der Aufruf ohne Blockierung zurück, sodass der Hauptthread fortfahren kann.

Das obige ist der detaillierte Inhalt vonWie kann ich nicht blockierende Lesevorgänge aus der Standardausgabe eines Unterprozesses 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage