Lectures non bloquantes sur les canaux de sous-processus en Python
Les canaux de sous-processus fournissent un moyen de communiquer avec des programmes externes à partir de Python. Cependant, la lecture à partir de la sortie standard bloque par défaut le processus jusqu'à ce que les données soient disponibles. Pour les applications nécessitant des lectures non bloquantes, il existe plusieurs approches à considérer.
Évitez fcntl, select et asyncproc
Bien que cela soit généralement suggéré, fcntl, select et asyncproc peut ne pas convenir à ce scénario. fcntl et select nécessitent un code spécifique à la plate-forme, tandis qu'asyncproc repose sur le multitraitement, ce qui peut introduire une surcharge supplémentaire et mal interagir avec les canaux.
Solution basée sur une file d'attente
Une solution fiable et la solution portable consiste à utiliser un appel Queue.get_nowait(). Voici comment cela fonctionne :
from queue import Queue, Empty from subprocess import PIPE, Popen from threading import Thread # Initialize a subprocess and a queue for output p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1) q = Queue() # Create a thread to enqueue output from the subprocess t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start() # Read the queue in a non-blocking manner try: line = q.get_nowait() except Empty: print('No output yet') else: # ... process the output line
Dans cette approche, un thread distinct est utilisé pour mettre en file d'attente la sortie du sous-processus dans la file d'attente. Le processus principal peut alors tenter d'extraire les données de la file d'attente sans blocage. Si la file d'attente est vide, elle renvoie une exception vide.
Cette solution est à la fois portable et efficace, et elle permet des lectures non bloquantes sur les canaux de sous-processus sans nécessiter de code spécifique à la plate-forme ou de dépendances supplémentaires.
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!