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
Libérer: 2024-12-25 15:07:14
original
295 Les gens l'ont consulté

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()
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal