Comment effectuer des lectures non bloquantes sur les canaux de sous-processus en Python
Lorsque vous travaillez avec le module de sous-processus en Python, il peut être nécessaire de effectuer des lectures non bloquantes sur le flux de sortie d'un sous-processus. Cela garantit que le programme ne se bloque pas lors de la lecture à partir d'un processus qui ne dispose peut-être d'aucune donnée disponible.
Lectures bloquantes traditionnelles
En général, le code suivant serait utilisé pour lire à partir de la sortie standard d'un sous-processus :
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()
Cependant, cette approche bloque l'exécution du programme jusqu'à ce que les données soient disponibles sur le standard sortie.
Lectures non bloquantes
Pour implémenter des lectures non bloquantes, une méthode courante consiste à utiliser la classe Queue du module de file d'attente Python. Voici un exemple :
import sys from subprocess import PIPE, Popen from threading import Thread try: from queue import Queue, Empty except ImportError: from Queue import Queue, Empty # python 2.x 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() # ... do other things here # read line without blocking try: line = q.get_nowait() # or q.get(timeout=.1) except Empty: print('no output yet') else: # got line # ... do something with line
Dans ce code, la fonction enqueue_output s'exécute dans un thread séparé et génère une sortie avec le sous-processus stdout. q.get_nowait()来检查队列中是否有数据.如果没有数据,它将引发 Vide异常,而如果成功,它将返回提取的行。
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!