2014-02-24 105 views
0

我在Raspberry Pi板上使用Python與Rasbian操作系統(基於Linux)。我的Python腳本使用GPIO(硬件輸入)。我注意到當GPIO激活時,它的回調會中斷當前線程。強制Python在單線程中運行

這迫使我使用鎖來防止線程訪問公共資源時出現問題。然而它變得有點複雜。讓我感到吃驚的是,如果GPIO「排隊」直到主線程進入睡眠狀態(例如命中time.sleep),它將大大簡化事情(即像JavaScript處理事物的方式)。

有沒有辦法在Python中實現這個?

回答

1

你使用的是RPi.GPIO library?或者在回調觸發時從C調用你的Python代碼?

如果是RPi.GPIO,它將運行一個有效的Python線程,如果您正確組織線程交互,則不需要額外的同步。

最常見的模式是將你的事件放入隊列中(在Python 3的情況下,this library可以完成這項工作,Python 2的作用是this one)。然後,當主線程準備好處理事件時,處理隊列中的所有事件。唯一的問題是你如何找到處理它們的時刻。最簡單的解決方案是實現一個可以隨時調用它的函數。如果使用長號碼sleep,則可能必須將其分成許多較小的睡眠區域,以確保外部事件經常處理得足夠頻繁。您甚至可以爲sleep實施自己的包裝,將一個較大的延遲拆分爲幾個較小的延遲,並處理它們之間的隊列。另一種解決方案是使用Queue.gettimeout參數,而不是sleep(它在事件到達隊列後立即返回),但是,如果您需要準確睡眠一段時間,您可能需要執行一些額外的魔術,例如如果您需要在處理事件後等待更多時間,請自己測量時間並再次致電get

1

使用多線程模塊中的隊列來存儲要執行的任務。主循環會定期檢查隊列中的條目,並在發現某些內容時逐個執行它們。

您的GPIO監控線程將他們的任務放入隊列中(只有一個需要從多個線程收集)。

您可以將任務建模爲可調用對象或函數對象。