2017-06-22 61 views
1

我正在嘗試構建一個可以通過網絡或手動控制進行控制的溫度控制模塊。我的程序的各個部分都可以工作,但我無法弄清楚如何使它們一起工作。我的溫度控制模塊是python,客戶端是C#。我應該爲我的項目使用線程多處理還是asycio?

至於物理組件去了我有一個鍵盤,設置溫度和打開和關閉加熱器和一個液晶屏幕,顯示溫度數據,當然還有一個溫度傳感器。我需要: 不斷髮送溫度數據到客戶端。 將日誌文件列表發送給客戶端。 等待來自客戶端的提示,以設置所需的溫度或向客戶端發送日誌文件。

到目前爲止,所有硬件都正常工作,網絡功能的每個單獨部分都可以工作,但不能在一起工作。我還沒有嘗試過使用物理和網絡組件。

我一直在嘗試爲此使用線程,但想知道如果我應該使用別的東西?

編輯: 這裏是背後究竟我想要做的基本邏輯:

硬件:

鍵盤需要花費數輸入,直到「*」它會設置一個臨時變量。

將溫度變量與傳感器數據進行比較,並相應地打開或關閉加熱器。

「#」接通加熱器的並設置臨時變量爲0。

傳感器數據被寫入到日誌文件而臨時變量不爲0

網絡:

在客戶端連接客戶端發送日誌文件列表

溫度傳感器數據不斷髮送到客戶端。

提示處理程序偵聽提示。

如果客戶端請求日誌文件,溫度數據被暫停,並且文件發送之後溫度數據被恢復。

客戶端可以發送命令到提示處理程序來設置的臨時變量來觸發加熱器

客戶端可以發送命令到提示處理程序,以停止所述加熱器,並設置臨時變量爲0

命令從鍵盤或客戶端應始終工作。

回答

1

多處理通常用於希望利用多處理內核的計算能力。多處理限制了您如何處理程序組件之間共享狀態的選項,因爲內存最初是在進程創建時複製的,但不會自動共享或更新。線程從相同的內存區域執行,並且沒有此限制,但無法利用多個內核來提高計算性能。您的應用程序聽起來並不像需要大量計算,並且只需從併發中受益,以便能夠同時處理用戶輸入,網絡連接和少量處理。我會說你需要線程而不是進程。我對asyncio的經驗不足,無法與線程進行比較。

編輯:這看起來像一個相當複雜的項目,所以不要指望它第一次打到「跑步」時就完美了,但絕對是非常可行和有趣的。

下面我將如何構建這個項目......

我看到有效的四個獨立的線程在這裏(爲愚蠢的小任務,也許小配套dameon線程)

  1. 我將有一個線程充當你的溫度控制器(PID控制/任何),只有加熱器輸出的唯一控制。 (其他線程可以請求更改設定值/控制模式(佔空比/ PID))

  2. 我將有一個主線程(帶有幾個dameon線程)來處理數據記錄:Mainad接受日誌記錄命令(暫停,恢復,獲取等)dameon線程輪詢溫度計,旋轉日誌文件等。

  3. 我不是很熟悉網絡,這將是特定於您的客戶端應用程序,但我可能012ff只適用於原型開發,或者可能是websocketsasyncio的一小部分。最主要的是,它會與getter和setter方法,而不是直接修改值

  4. 最後的數據記錄儀和溫度控制器線程交互,爲鍵盤輸入,我很可能只是做了一個快速tkinter應用搶按鍵,因爲這就是我所知道的。再次,使用tkinter應用程序形成請求,但不要直接修改值;線程之間「交談」時使用getters和setter。它只是讓事情更好地組織和劃分。

+0

感謝您的意見。 – drako234

+0

@ drako234也許你可以寫一些僞代碼或者繪製你的子系統圖,然後我可以試試我可以分配給不同任務的線程。這是一個「魔鬼在細節」問題,所以我認爲一個很好的方法來處理它是你的個人組件框架的框圖,所有需要一起工作 – Aaron

+0

是否足夠的編輯? – drako234

相關問題