Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengelakkan Program Python daripada Digantung Semasa Membaca Output Proses?

Bagaimana untuk Mengelakkan Program Python daripada Digantung Semasa Membaca Output Proses?

Susan Sarandon
Susan Sarandonasal
2024-11-02 13:54:29413semak imbas

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

Hentikan membaca output proses dalam Python tanpa hang?

Masalah:

Atur cara Python perlu berinteraksi dengan luaran proses (cth., "atas") yang secara berterusan menghasilkan output. Walau bagaimanapun, hanya membaca output secara terus boleh menyebabkan program digantung selama-lamanya.

Penyelesaian:

Untuk mengelakkan penggantungan, adalah penting untuk menggunakan mekanisme tidak menyekat atau tak segerak apabila output proses membaca. Berikut adalah beberapa pendekatan yang mungkin:

Fail Sementara Terkumpul (Disyorkan)

Kaedah ini menggunakan objek fail khusus untuk menyimpan output proses.

#! /usr/bin/env python<br>subproses import<br>import tempfile<br>masa import</p>
<p>def main():</p>
<pre class="brush:php;toolbar:false"># Open a temporary file (automatically deleted on closure)
f = tempfile.TemporaryFile()

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

# Wait for a specified duration
time.sleep(2)

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

# Rewind and read the captured output from the file
f.seek(0)
output = f.read()

# Print the output
print(output)
f.close()

jika nama == "__main__":

main()

Bacaan Output Berasaskan Benang

Pendekatan ini menggunakan benang berasingan untuk membaca output proses secara berterusan sambil utas utama diteruskan dengan tugasan lain.

import koleksi
subproses import
benang import
masa import

def read_output(proses, tambahkan):

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

def main():

# Start the process and redirect stdout
process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)

# Create a thread for output reading
q = collections.deque(maxlen=200)
t = threading.Thread(target=read_output, args=(process, q.append))
t.daemon = True
t.start()

# Wait for the specified duration
time.sleep(2)

# Print the saved output
print(''.join(q))

jika nama == "__main__":

main()

signal.alarm() (Unix-only)

Kaedah ini menggunakan isyarat Unix untuk menamatkan proses selepas tamat masa yang ditentukan, tidak kira sama ada semua output telah dibaca.

koleksi import
isyarat import
subproses import

Penggera kelas(Pengecualian):

pass

penggera_definisi(tanda, bingkai):

raise Alarm

def main():

# Start the process and redirect stdout
process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)

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

try:
    # Read and save a specified number of lines
    q = collections.deque(maxlen=200)
    for line in iter(process.stdout.readline, ""):
        q.append(line)
    signal.alarm(0)  # Cancel alarm
except Alarm:
    process.terminate()
finally:
    # Print the saved output
    print(''.join(q))

jika nama == "__main__":

main()

benang.Pemasa

Pendekatan ini menggunakan pemasa untuk menamatkan proses selepas tamat masa yang ditentukan. Ia berfungsi pada kedua-dua sistem Unix dan Windows.

import koleksi
subproses import
benang import

def main():

# Start the process and redirect stdout
process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True)

# Create a timer for process termination
timer = threading.Timer(2, process.terminate)
timer.start()

# Read and save a specified number of lines
q = collections.deque(maxlen=200)
for line in iter(process.stdout.readline, ""):
    q.append(line)
timer.cancel()

# Print the saved output
print(''.join(q))

jika nama == "__main__":

main()

Tiada Benang, Tiada Isyarat

Kaedah ini menggunakan gelung berasaskan masa ringkas untuk menyemak output proses dan mematikannya jika ia melebihi tamat masa yang ditentukan.

import koleksi
subproses import
sistem import
masa import

def main():

args = sys.argv[1:]
if not args:
    args = ['top']

# Start the process and redirect stdout
process = subprocess.Popen(args, stdout=subprocess.PIPE, close_fds=True)

# Save a specified number of lines
q = collections.deque(maxlen=200)

# Set a timeout duration
timeout = 2

now = start = time.time()
while (now - start) < timeout:
    line = process.stdout.readline()
    if not line:
        break
    q.append(line)
    now = time.time()
else:  # On timeout
    process.terminate()

# Print the saved output
print(''.join(q))

jika nama == "__main__":

main()

Nota: Bilangan baris yang disimpan boleh dilaraskan mengikut keperluan dengan menetapkan parameter 'maxlen' bagi struktur data deque.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Program Python daripada Digantung Semasa Membaca Output Proses?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn