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
Lepaskan: 2024-10-29 18:19:09
asal
904 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan