Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Melaksanakan Bacaan Tidak Menyekat daripada PAIP Subproses?
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!