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
DDDoriginal
2024-12-17 22:06:12178parcourir

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

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

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

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

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!

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