Maison > développement back-end > Tutoriel Python > Comment obtenir des lectures de canal de sous-processus non bloquantes en Python ?

Comment obtenir des lectures de canal de sous-processus non bloquantes en Python ?

Linda Hamilton
Libérer: 2024-12-17 05:30:25
original
967 Les gens l'ont consulté

How to Achieve Non-Blocking Subprocess Pipe Reads in Python?

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()
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal