ホームページ >バックエンド開発 >Python チュートリアル >継続的なプロセス出力をキャプチャするときに Python プログラムがハングしないようにするにはどうすればよいですか?

継続的なプロセス出力をキャプチャするときに Python プログラムがハングしないようにするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 18:19:09906ブラウズ

How Can I Prevent Python Programs from Hanging When Capturing Continuous Process Output?

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

os.popen() を使用してプロセス出力をキャプチャする場合、プログラムは次の場合にハングする可能性があります。プロセスは継続的にデータを出力します。この問題に対処するには、次のような代替方法の使用を検討してください。

サブプロセスとスレッドの使用

subprocess.Popen でプロセスを開始し、出力を読み取るスレッドを作成します。そしてそれをキューに保存します。特定のタイムアウト後にプロセスを終了します。

<code class="python">import subprocess
import threading
import time

def read_output(process, append):
    for line in iter(process.stdout.readline, ""):
        append(line)

def main():
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)
    try:
        q = collections.deque(maxlen=200)
        t = threading.Thread(target=read_output, args=(process, q.append))
        t.daemon = True
        t.start()
        time.sleep(2)
    finally:
        process.terminate()
    print(''.join(q))</code>

シグナル ハンドラーの使用

指定したタイムアウト後に例外を発生させるには signal.alarm() を使用します。これにより、プロセスが強制的に終了し、出力をキャプチャできるようになります。

<code class="python">import signal
import subprocess
import time

def alarm_handler(signum, frame):
    raise Alarm

def main():
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(2)
    q = collections.deque(maxlen=200)
    try:
        for line in iter(process.stdout.readline, ""):
            q.append(line)
        signal.alarm(0)
    except Alarm:
        process.terminate()
    finally:
        print(''.join(q))</code>

タイマーの使用

タイムアウト後にプロセスを終了するには、threading.Timer を使用します。

<code class="python">import threading
import subprocess

def main():
    process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)
    timer = threading.Timer(2, process.terminate)
    timer.start()
    q = collections.deque(process.stdout, maxlen=200)
    timer.cancel()
    print(''.join(q))</code>

代替アプローチ

  • 一時ファイル: プロセス出力をファイルに一時的に保存し、プロセスが終了した後に読み取ります。
  • 定期ポーリング: プロセスが終了するまでループで出力を定期的に読み取ります。
  • ノンブロッキング出力ストリーム:ハングを回避するためにノンブロッキング出力ストリームをサポートするライブラリを使用します。

これらのソリューションでは、さらに複雑さや互換性の問題が発生する可能性があることに注意してください。特定のニーズとプラットフォームに最適なアプローチを選択してください。

以上が継続的なプロセス出力をキャプチャするときに Python プログラムがハングしないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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