Maison > développement back-end > Tutoriel Python > Comment puis-je effectuer des lectures non bloquantes à partir du flux de sortie d'un sous-processus en Python ?

Comment puis-je effectuer des lectures non bloquantes à partir du flux de sortie d'un sous-processus en Python ?

DDD
Libérer: 2024-12-17 22:06:12
original
187 Les gens l'ont consulté

How Can I Perform Non-Blocking Reads from a Subprocess's Output Stream in Python?

Lectures non bloquantes sur les flux de sortie des sous-processus en Python

En Python, le module de sous-processus fournit un moyen pratique de lancer et d'interagir avec des processus. Cependant, il est crucial de gérer efficacement les interactions d'E/S entre les processus parent et enfant.

Considérez le scénario suivant : vous souhaitez effectuer des lectures non bloquantes sur le flux de sortie standard d'un sous-processus. Par défaut, p.stdout.readline() se bloque jusqu'à ce que les données soient disponibles dans le tampon. Pour résoudre ce problème, nous pouvons utiliser une technique qui implique un thread séparé et une file d'attente.

Tout d'abord, créez une file d'attente pour stocker les lignes de sortie :

from Queue import Queue
Copier après la connexion

Ensuite, démarrez un fil de discussion qui lit lignes de la sortie standard du sous-processus et les met en file d'attente :

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()
Copier après la connexion

Initialisez le sous-processus et démarrez le fil de discussion :

p = Popen(['myprogram.exe'], stdout=PIPE)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True
t.start()
Copier après la connexion

Pour lire une ligne non bloquante, utilisez ce qui suit :

try:
    line = q.get_nowait()  # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else:  # got line
    # do something with the line
Copier après la connexion

Cette méthode est compatible multiplateforme et garantit des lectures non bloquantes, vous permettant de lire efficacement traiter les données du sous-processus.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal