Maison >développement back-end >Tutoriel Python >Comment puis-je obtenir des lectures non bloquantes à partir de la sortie standard d'un sous-processus ?

Comment puis-je obtenir des lectures non bloquantes à partir de la sortie standard d'un sous-processus ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-25 15:07:14268parcourir

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

Lectures non bloquantes pour la sortie standard du sous-processus

Lors de l'utilisation du module de sous-processus pour lancer des sous-processus et se connecter à leurs flux de sortie standard, il est Il est essentiel d'effectuer des lectures non bloquantes pour maintenir la réactivité du programme. Cet article examine les techniques permettant d'obtenir des lectures non bloquantes sur les sorties standard des sous-processus ou d'évaluer la disponibilité des données avant d'invoquer .readline.

Approche de blocage traditionnelle

En général, continuez à lire la sortie standard est bloquante, ce qui signifie que l'exécution s'arrête jusqu'à ce que les données soient disponibles. Ceci est démontré ci-dessous :

import subprocess

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()

Cependant, dans cette approche, l'exécution s'arrêtera si aucune donnée n'est immédiatement présente dans le flux.

Surmonter le blocage des lectures avec Queue.get_nowait ()

Pour contourner le blocage des lectures, une approche multiplateforme fiable consiste à utiliser le module Queue et son méthode get_nowait(). Cette méthode gère gracieusement l'absence de données dans le flux, permettant des lectures non bloquantes :

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

Dans cette approche, un thread distinct est généré pour mettre en file d'attente en continu la sortie de la sortie standard du sous-processus dans la file d'attente. Le thread principal peut alors effectuer des lectures non bloquantes en appelant get_nowait(). Si la file d'attente est vide, l'appel revient sans blocage, permettant au thread principal de continuer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn