Maison >développement back-end >Tutoriel Python >Comment puis-je obtenir des lectures non bloquantes à partir de la sortie standard d'un sous-processus ?
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()
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
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!