Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Melaksanakan Bacaan Tidak Menyekat daripada PAIP Subproses?

Bagaimana untuk Melaksanakan Bacaan Tidak Menyekat daripada PAIP Subproses?

Susan Sarandon
Lepaskan: 2024-12-22 15:13:10
asal
419 orang telah melayarinya

How to Perform Non-Blocking Reads from a Subprocess PIPE?

Membaca daripada PAIP Subproses dengan Cara Tidak Menghalang

Apabila bekerja dengan subproses, adalah penting untuk melaksanakan bacaan tanpa menyekat untuk mengelakkan terhenti proses induk sementara menunggu output daripada proses anak. Isu timbul apabila menggunakan subprocess.Popen, di mana readline() menyekat jika tiada data yang tersedia.

Pendekatan Penyekatan Tradisional

Biasanya, pembangun menggunakan kod berikut untuk membaca daripada output standard subproses:

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini menyekat pelaksanaan jika tiada data tersedia.

Penyelesaian Tidak Menghalang

Penyelesaian merentas platform yang boleh dipercayai melibatkan penggunaan Queue.get_nowait(), seperti yang ditunjukkan dalam kod di bawah:

import sys
from subprocess import PIPE, Popen
from threading  import Thread

try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line
Salin selepas log masuk

Pendekatan ini menggunakan benang berasingan untuk memasukkan baris keluaran ke dalam baris gilir. Benang utama kemudiannya boleh menyemak sama ada baris gilir mengandungi data tanpa menyekat, menggunakan get_nowait(). Penyelesaian mudah alih ini membolehkan bacaan tanpa sekatan pada output subproses merentas pelbagai sistem pengendalian.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Bacaan Tidak Menyekat daripada PAIP Subproses?. 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