首頁 > 後端開發 > Python教學 > 如何在Python中實現子進程管道的非阻塞讀取?

如何在Python中實現子進程管道的非阻塞讀取?

DDD
發布: 2024-12-19 13:55:11
原創
773 人瀏覽過

How Can I Achieve Non-Blocking Reads from Subprocess Pipes in Python?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板