Maison >développement back-end >Tutoriel Python >Comment empêcher Python de se bloquer lors de la lecture de la sortie d'un processus constamment mis à jour ?

Comment empêcher Python de se bloquer lors de la lecture de la sortie d'un processus constamment mis à jour ?

DDD
DDDoriginal
2024-10-28 08:44:30869parcourir

How to Prevent Python from Freezing When Reading Output from a Constantly Updating Process?

Arrêter la sortie du processus de lecture en Python sans interruption

Lorsque vous essayez de lire la sortie d'un processus constamment mis à jour en Python, vous pouvez rencontrer des problèmes de blocage. Ce problème survient spécifiquement lors de l'utilisation de la méthode readlines().

Problème : blocage lors de l'utilisation de readlines()

Dans l'extrait de code fourni, le process = os.popen("top"). La ligne readlines() provoque le blocage du programme. En effet, readlines() lit l'intégralité de la sortie du sous-processus en une seule fois, ce qui peut être important et entraîner une longue opération de blocage.

Utiliser subprocess.Popen()

Une meilleure approche est pour utiliser la fonction subprocess.Popen() pour créer un sous-processus et gérer ses entrées et sorties. Voici comment procéder :

<code class="python">import subprocess

process = subprocess.Popen('top')
time.sleep(2)
os.popen("killall top")
print process</code>

Ce code utilise Popen() pour créer un sous-processus en cours d'exécution. Après avoir attendu 2 secondes, il termine le processus principal et imprime enfin l'objet du sous-processus. Cependant, cette approche renvoie toujours un objet non formaté.

Solution utilisant un fichier temporaire

Pour lire la sortie du sous-processus sans bloquer le programme, vous pouvez utiliser un fichier temporaire pour stocker la sortie. Voici une version améliorée du code :

<code class="python">#!/usr/bin/env python
import subprocess
import tempfile
import time

def main():
    # Create a temporary file to store the subprocess output
    f = tempfile.TemporaryFile()

    # Start the subprocess and redirect its stdout to the temporary file
    process = subprocess.Popen(["top"], stdout=f)

    # Wait for a few seconds
    time.sleep(2)

    # Kill the subprocess
    process.terminate()
    process.wait()

    # Seek to the start of the temporary file and read the output
    f.seek(0)
    output = f.read()

    # Close the temporary file
    f.close()

    # Print the output of the subprocess
    print(output)

if __name__=="__main__":
    main()</code>

Cette solution garantit que le programme ne se bloque pas lors de la lecture de la sortie du sous-processus. La méthode subprocess.wait() attend la fin du sous-processus, garantissant que toutes les sorties ont été écrites dans le fichier avant d'y accéder.

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!

Déclaration:
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