Maison > développement back-end > Tutoriel Python > Comment puis-je obtenir des lectures non bloquantes à partir de canaux de sous-processus en Python ?

Comment puis-je obtenir des lectures non bloquantes à partir de canaux de sous-processus en Python ?

DDD
Libérer: 2024-12-19 13:55:11
original
791 Les gens l'ont consulté

How Can I Achieve Non-Blocking Reads from Subprocess Pipes in Python?

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal