Python 中子進程管道的非阻塞讀取
子進程管道提供了一種在Python 中與外部程序進行通信的方法。但是,預設從標準輸出讀取會阻止該過程,直到資料可用為止。對於需要非阻塞讀取的應用程序,可以考慮多種方法。
避免 fcntl、select 和 asyncproc
雖然通常建議使用 fcntl、select 和 asyncproc可能不適合這種場景。 fcntl 和 select 需要特定於平台的程式碼,而 asyncproc 依賴多處理,這可能會帶來額外的開銷,並且與管道的互動效果很差。
基於佇列的解決方案
可靠的解決方案便攜式解決方案是使用 Queue.get_nowait() 呼叫。它的工作原理如下:
from queue import Queue, Empty from subprocess import PIPE, Popen from threading import Thread # Initialize a subprocess and a queue for output p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1) q = Queue() # Create a thread to enqueue output from the subprocess t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start() # Read the queue in a non-blocking manner try: line = q.get_nowait() except Empty: print('No output yet') else: # ... process the output line
在這種方法中,使用單獨的執行緒將子程序的輸出排隊到佇列中。然後主進程可以嘗試從佇列中取得資料而不會阻塞。如果佇列為空,則傳回 Empty 異常。
此解決方案既可移植又高效,並且允許在子進程管道上進行非阻塞讀取,而不需要特定於平台的程式碼或額外的依賴項。
以上是如何在Python中實現子進程管道的非阻塞讀取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!