簡體   English   中英

python中不同模塊之間通信的最佳實踐

[英]Best practice for communication between different modules in python

我在 5 年前寫的 python 中重新審視了一個應用程序的開發(這是我在 python 2.7 中的第一個有趣的項目/應用程序,當我現在重新審視它時,我正在努力做出正面或反面)。 該應用程序具有以下單元/模塊:

  • 從相機獲取數據(數據采集模塊 - DAQ)
  • 處理數據並確定是否應移動電機(控制)
  • 移動了一個執行器(Actuator)
  • 在幾個 tk windows 上顯示數據並激活開關。 (展示)

那時(在 python 2.7 中)我為上述每個單元開發了單獨的模塊。 為每個單元生成不同的線程,我使用隊列傳遞圖像數據,以及 Control 和 Actuator 模塊之間的控制命令。

隨着進程間通信的選項(和流行語)成倍增加,我希望了解我應該研究哪些概念。 例如,在 3.10 中有 asyncio,其中包含 Coroutines 和 Tasks、Synchronization Primitives、Subprocesses、Queues 等概念。

我的主要目標是能夠編寫獨立運行的單獨單元,以便(理論上)更容易調試單元(甚至編寫單元測試)。


更新

正如評論中提到的,我所描述的是同一進程的線程之間的通信,因此 IPC 標記可能不合適。 我將在下面詳細說明我為什么選擇 IPC 標簽。

盡管我之前使用單個進程和不同線程之間的通信開發了該軟件,但我記得由於 GIL,這並不是最佳的。 GIL 以隨機間隔強制數據采集線程休眠,這使得數據收集以高采樣率隨機(由於要求低,應用程序可以充分工作)。

理想情況下,我想研究一個可以有一個單獨的過程收集數據的方案。 據我了解,不同的進程在不同的處理器上運行,因此不應受到 GIL 的影響。

進程間通信具體是指多個單獨的進程通信。 聽起來您有多個模塊在一個進程中進行通信。 (異步和線程是進程內的,它們不跨越進程。)如果需要,您可以使用隊列。

如果您需要將某些東西作為一個單獨的進程(例如回避 GIL),您可以使用multiprocessing模塊及其對象和原語進行通信。 但是,您應該意識到,在序列化中存在一些在單個進程中不會有的顯着開銷。

暫無
暫無

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

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