Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann verhindert werden, dass Python beim Lesen der Ausgabe eines sich ständig aktualisierenden Prozesses einfriert?

Wie kann verhindert werden, dass Python beim Lesen der Ausgabe eines sich ständig aktualisierenden Prozesses einfriert?

DDD
DDDOriginal
2024-10-28 08:44:30731Durchsuche

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

Das Lesen der Prozessausgabe in Python stoppen, ohne zu hängen

Beim Versuch, die Ausgabe eines sich ständig aktualisierenden Prozesses in Python zu lesen, kann es zu Problemen beim Einfrieren kommen. Dieses Problem tritt insbesondere bei Verwendung der readlines()-Methode auf.

Problem: Einfrieren bei Verwendung von readlines()

Im bereitgestellten Code-Snippet ist der Prozess = os.popen("top"). Die Zeile readlines() führt dazu, dass das Programm hängen bleibt. Dies liegt daran, dass readlines() die gesamte Ausgabe des Unterprozesses auf einmal liest, was umfangreich sein und zu einem langen Blockierungsvorgang führen kann.

Die Verwendung von subprocess.Popen()

Ein besserer Ansatz ist um die Funktion subprocess.Popen() zu verwenden, um einen Unterprozess zu erstellen und seine Eingabe und Ausgabe zu verwalten. So können Sie es machen:

<code class="python">import subprocess

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

Dieser Code verwendet Popen(), um einen Unterprozess zu erstellen, der oben ausgeführt wird. Nach einer Wartezeit von 2 Sekunden wird der oberste Prozess beendet und schließlich das Unterprozessobjekt gedruckt. Allerdings gibt dieser Ansatz immer noch ein unformatiertes Objekt zurück.

Lösung mit einer temporären Datei

Um die Ausgabe des Unterprozesses zu lesen, ohne das Programm zu blockieren, können Sie eine temporäre Datei zum Speichern der Ausgabe verwenden. Hier ist eine verbesserte Version des Codes:

<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>

Diese Lösung stellt sicher, dass das Programm beim Lesen der Ausgabe des Unterprozesses nicht hängen bleibt. Die Methode subprocess.wait() wartet auf die Beendigung des Unterprozesses und stellt so sicher, dass die gesamte Ausgabe in die Datei geschrieben wurde, bevor auf sie zugegriffen wird.

Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass Python beim Lesen der Ausgabe eines sich ständig aktualisierenden Prozesses einfriert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn