連続プロセス出力を読み取るときに Python プログラムがハングしないようにするにはどうすればよいですか?

DDD
リリース: 2024-11-01 09:47:02
オリジナル
335 人が閲覧しました

How to Avoid Python Programs Hanging When Reading Continuous Process Output?

Python でのハングなしのプロセス出力読み取りの停止

バックグラウンド

連続出力を生成するツールで Python の os.popen() 関数を使用する場合、出力を読み取ろうとすると、プログラムが頻繁にハングします。

os.popen()問題

問題のある行 process = os.popen("top").readlines() は、プロセス出力全体を一度に読み取ろうとする readlines() によりプログラムを停止させます。

subprocess.Popen() による解決策

この問題を解決するには、os.popen() の代わりに subprocess.Popen() を使用します。修正された例は次のとおりです:

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

# Start "top" process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Wait for 2 seconds
time.sleep(2)

# Send kill signal to "top" process
os.popen("killall top")

# Read process output
output, _ = process.communicate()
print(output.decode())</code>
ログイン後にコピー

この修正されたコード:

  • readlines() の代わりに communication() を使用してプロセス出力を変数にキャプチャします。
  • kill シグナルを「トップ」プロセスに送信します。
  • のファイルの終わりを宣言します。

テールのようなアプローチ

プロセスの出力の一部だけが必要な場合は、テールのようなソリューションを使用してキャプチャできます。特定の行数。

スレッドベースのアプローチ

別のスレッドでプロセス出力をキャプチャするには、以下:

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

# Start process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Define function to read process output in a thread
def read_output(process):
    for line in iter(process.stdout.readline, ""):
        ...  # Implement your logic here to process each line

# Create and start a thread for reading and processing output
reading_thread = threading.Thread(target=read_output, args=(process,))
reading_thread.start()

# Wait for 2 seconds, then terminate the process
time.sleep(2)
process.terminate()

# Wait for the reading thread to complete
reading_thread.join()</code>
ログイン後にコピー

signal.alarm() アプローチ

指定したタイムアウト後に signal.alarm() を使用してプロセスを終了することもできます:

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

# Define signal handler
def alarm_handler(signum, frame):
    # Raise an exception to terminate the process reading
    raise Exception

# Set signal handler and alarm for 2 seconds
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(2)

# Start process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Capture process output
number_of_lines = 200
q = collections.deque(maxlen=number_of_lines)
for line in iter(process.stdout.readline, ""):
    q.append(line)

# Cancel alarm
signal.alarm(0)

# Print captured output
print(''.join(q))</code>
ログイン後にコピー

threading.Timer アプローチ

または、threading.Timer を使用してプロセスをスケジュールすることもできます終了:

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

# Define function to terminate the process
def terminate_process(process):
    process.terminate()

# Start process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Create and start a timer to terminate process in 2 seconds
timer = threading.Timer(2, terminate_process, [process])
timer.start()

# Capture process output
number_of_lines = 200
q = collections.deque(process.stdout, maxlen=number_of_lines)

# Cancel timer
timer.cancel()

# Print captured output
print(''.join(q))</code>
ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!