ホームページ >バックエンド開発 >Python チュートリアル >継続的に更新されるプロセスから出力を読み取るときに Python がフリーズしないようにするにはどうすればよいですか?

継続的に更新されるプロセスから出力を読み取るときに Python がフリーズしないようにするにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-28 08:44:30869ブラウズ

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

ハングせずに Python でのプロセス出力の読み取りを停止する

Python で常に更新されるプロセスの出力を読み取ろうとすると、フリーズの問題が発生する可能性があります。この問題は、特に readlines() メソッドを使用する場合に発生します。

問題: readlines() を使用するとフリーズする

提供されたコード スニペットでは、 process = os.popen("top") です。 readlines() 行によりプログラムがハングします。これは、readlines() がサブプロセスの出力全体を一度に読み取るためです。これは量が多くなり、ブロック操作が長くなる可能性があります。

subprocess.Popen() を使用する

より良いアプローチは次のとおりです。 subprocess.Popen() 関数を使用してサブプロセスを作成し、その入出力を管理します。その方法は次のとおりです。

<code class="python">import subprocess

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

このコードは、Popen() を使用して、トップを実行するサブプロセスを作成します。 2 秒待った後、トッププロセスを終了し、最後にサブプロセスオブジェクトを出力します。ただし、この方法でもフォーマットされていないオブジェクトが返されます。

一時ファイルを使用した解決策

プログラムをブロックせずにサブプロセスの出力を読み取るには、一時ファイルを使用して出力を保存できます。コードの改良版は次のとおりです。

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

このソリューションにより、サブプロセスの出力の読み取り中にプログラムがハングしないことが保証されます。 subprocess.wait() メソッドは、サブプロセスが終了するのを待ち、ファイルにアクセスする前にすべての出力がファイルに書き込まれたことを確認します。

以上が継続的に更新されるプロセスから出力を読み取るときに Python がフリーズしないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。