簡體   English   中英

如何在單獨的 Python 多處理過程中從數據 stream 中獲取最新值?

[英]How can I get the most recent value from a data stream in a separate Python multiprocessing process?

我有一個從傳感器讀取的過程和另一個從圖表中讀取的過程。 但是,繪圖儀可能比傳感器讀數慢,尤其是在添加了許多傳感器時。

我看到將信息從傳感器傳遞給繪圖者的兩個選項:管道和 mp.Value。 我所知道的管道應該更快,但我擔心繪圖器開始延遲的問題:如果傳感器采樣的速度是繪圖器的 n 倍,那么對於每個繪圖器時間步,我們只會在 1/n 時間步長未來(例如,如果兩倍快,20 秒后,繪圖員只顯示 10 秒)。 我可以看到傳感器輪詢 pipe 並在添加新值之前刪除所有值,但這聽起來很昂貴。 mp.Value 路線確實需要更明確的鎖定,我相信它不如 Pipe class 快,盡管我不確定。

處理這種多處理以避免這里出現問題的最佳方法是什么?

編輯澄清:我不在乎繪圖員是否獲得所有信息。 使用最近的值很好,這就是為什么標題說“僅管道最后一個值”。 繪圖員的主要要求只是讓 plot 不會延遲,即使我們通過丟棄數據有效地進行下采樣。 傳感器確實需要比繪圖員讀取的速度更快,因為數據也在被記錄和處理,我們不想對這些信息進行下采樣。

要獲取最新的傳感器值,您實際上需要傳感器進程等到繪圖員准備好發送數據。 有幾種方法可以做到這一點,但我認為實際上使用兩個單向( duplex=False )管道是 go 的最佳方法,因為您不需要涉及任何額外的線程或信號量。 在此設置中,第一個 pipe 正常發送數據傳感器-> 繪圖儀,但第二個只是表示繪圖儀已准備好立即接受數據的信號。 用散文表達有點尷尬,所以這里是偽代碼:

def grapher():
    while True:
        data = pipe_to_grapher.recv()
        graph(data)
        pipe_to_sensor.send(None)  # Can be any value

def sensor():
    while True:
        data = sense()
        if pipe_to_sensor.poll():
            pipe_to_grapher.send(data)  # Freshest possible
            pipe_to_sensor.recv()  # Clear the pipe
        record(data)

請注意,如果poll()返回False ,傳感器可以直接傳遞,因為這表明繪圖者尚未准備好接收數據。 您還可以輕松地擴展系統以使用特殊值將有關一個進程的 state 的信息傳遞給另一個進程,例如關閉命令。

(預編輯答案如下)

這個問題似乎是在詢問如何對傳感器數據流應用背壓 聽起來multiprocessing.Queue對於您的特定情況可能是一個很好的解決方案。 它在內部使用 pipe,因此它具有類似的性能特征,但它也有專門的put()方法,可以與maxsize參數一起使用,您可以將其設置為像 1 這樣的低數字,以便傳感器進程等待直到grapher進程檢索到一個項目,然后再返回獲取更多數據。

如果傳感器有自己的緩沖區需要清除,您可以改用put_nowait()並捕獲Full錯誤,表示繪圖員將無法 plot 該數據應該被丟棄。 這節省了腌制和發送數據的開銷,但可能導致非常快速地輪詢傳感器,這可能是開銷本身的來源,具體取決於設備/驅動程序/api。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM