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 ?
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!