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
Susan Sarandonasal
2024-12-22 15:13:10409semak imbas

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

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

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!

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