Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Mengelakkan Program Python daripada Digantung Semasa Membaca Output Proses?
Masalah:
Atur cara Python perlu berinteraksi dengan luaran proses (cth., "atas") yang secara berterusan menghasilkan output. Walau bagaimanapun, hanya membaca output secara terus boleh menyebabkan program digantung selama-lamanya.
Penyelesaian:
Untuk mengelakkan penggantungan, adalah penting untuk menggunakan mekanisme tidak menyekat atau tak segerak apabila output proses membaca. Berikut adalah beberapa pendekatan yang mungkin:
Kaedah ini menggunakan objek fail khusus untuk menyimpan output proses.
#! /usr/bin/env python<br>subproses import<br>import tempfile<br>masa import</p> <p>def main():</p> <pre class="brush:php;toolbar:false"># Open a temporary file (automatically deleted on closure) f = tempfile.TemporaryFile() # Start the process and redirect stdout to the file p = subprocess.Popen(["top"], stdout=f) # Wait for a specified duration time.sleep(2) # Kill the process p.terminate() p.wait() # Rewind and read the captured output from the file f.seek(0) output = f.read() # Print the output print(output) f.close()
jika nama == "__main__":
main()
Pendekatan ini menggunakan benang berasingan untuk membaca output proses secara berterusan sambil utas utama diteruskan dengan tugasan lain.
subproses import
benang import
masa import
def read_output(proses, tambahkan):
for line in iter(process.stdout.readline, ""): append(line)
def main():
# Start the process and redirect stdout process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) # Create a thread for output reading q = collections.deque(maxlen=200) t = threading.Thread(target=read_output, args=(process, q.append)) t.daemon = True t.start() # Wait for the specified duration time.sleep(2) # Print the saved output print(''.join(q))
jika nama == "__main__":
main()
Kaedah ini menggunakan isyarat Unix untuk menamatkan proses selepas tamat masa yang ditentukan, tidak kira sama ada semua output telah dibaca.
isyarat import
subproses import
Penggera kelas(Pengecualian):
pass
penggera_definisi(tanda, bingkai):
raise Alarm
def main():
# Start the process and redirect stdout process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) # Set signal handler signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(2) try: # Read and save a specified number of lines q = collections.deque(maxlen=200) for line in iter(process.stdout.readline, ""): q.append(line) signal.alarm(0) # Cancel alarm except Alarm: process.terminate() finally: # Print the saved output print(''.join(q))
jika nama == "__main__":
main()
Pendekatan ini menggunakan pemasa untuk menamatkan proses selepas tamat masa yang ditentukan. Ia berfungsi pada kedua-dua sistem Unix dan Windows.
subproses import
benang import
def main():
# Start the process and redirect stdout process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) # Create a timer for process termination timer = threading.Timer(2, process.terminate) timer.start() # Read and save a specified number of lines q = collections.deque(maxlen=200) for line in iter(process.stdout.readline, ""): q.append(line) timer.cancel() # Print the saved output print(''.join(q))
jika nama == "__main__":
main()
Kaedah ini menggunakan gelung berasaskan masa ringkas untuk menyemak output proses dan mematikannya jika ia melebihi tamat masa yang ditentukan.
subproses import
sistem import
masa import
def main():
args = sys.argv[1:] if not args: args = ['top'] # Start the process and redirect stdout process = subprocess.Popen(args, stdout=subprocess.PIPE, close_fds=True) # Save a specified number of lines q = collections.deque(maxlen=200) # Set a timeout duration timeout = 2 now = start = time.time() while (now - start) < timeout: line = process.stdout.readline() if not line: break q.append(line) now = time.time() else: # On timeout process.terminate() # Print the saved output print(''.join(q))
jika nama == "__main__":
main()
Nota: Bilangan baris yang disimpan boleh dilaraskan mengikut keperluan dengan menetapkan parameter 'maxlen' bagi struktur data deque.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Program Python daripada Digantung Semasa Membaca Output Proses?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!