Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menghalang Program Python daripada Digantung Apabila Menangkap Output Proses Berterusan?

Bagaimanakah Saya Boleh Menghalang Program Python daripada Digantung Apabila Menangkap Output Proses Berterusan?

Susan Sarandon
Susan Sarandonasal
2024-10-29 18:19:09904semak imbas

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

Hentikan Membaca Output Proses dalam Python Tanpa Hang

Apabila menggunakan os.popen() untuk menangkap output proses, atur cara boleh hang jika proses secara berterusan mengeluarkan data. Untuk menangani isu ini, pertimbangkan untuk menggunakan kaedah alternatif seperti:

Menggunakan Subproses dan Benang

Mulakan proses dengan subproses. Buka, buat urutan untuk membaca output, dan simpan dalam baris gilir. Tamatkan proses selepas tamat masa tertentu.

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

Menggunakan Pengendali Isyarat

Gunakan signal.alarm() untuk menimbulkan pengecualian selepas tamat masa yang ditentukan. Ini memaksa proses untuk ditamatkan, membolehkan output ditangkap.

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

Menggunakan Pemasa

Gunakan threading.Pemasa untuk menamatkan proses selepas tamat masa.

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

Alternatif Pendekatan

  • Fail Sementara: Simpan sementara output proses ke fail, kemudian baca selepas proses dimatikan.
  • Biasa Undian: Baca keluaran secara berkala dalam gelung sehingga prosesnya ditamatkan.
  • Strim Output Tidak Menyekat: Gunakan pustaka yang menyokong aliran keluaran tidak menyekat untuk mengelakkan hang.

Perhatikan bahawa penyelesaian ini mungkin memperkenalkan tambahan masalah kerumitan atau keserasian. Pilih pendekatan yang paling sesuai dengan keperluan dan platform khusus anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Program Python daripada Digantung Apabila Menangkap Output Proses Berterusan?. 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