我希望能夠使用來自多個應用程序的USB設備(例如我運行一個Flask Web應用程序),確保一次只有一個使用它。如何防止對USB設備等資源的併發訪問?
在我的情況下,我正在使用一個繼電器打開/關閉一扇門。門大約需要20秒才能打開。在此期間,繼電器不應該被激活,因爲這會將門鎖在中間。
在此先感謝!
我希望能夠使用來自多個應用程序的USB設備(例如我運行一個Flask Web應用程序),確保一次只有一個使用它。如何防止對USB設備等資源的併發訪問?
在我的情況下,我正在使用一個繼電器打開/關閉一扇門。門大約需要20秒才能打開。在此期間,繼電器不應該被激活,因爲這會將門鎖在中間。
在此先感謝!
您有許多可能的解決方案。
posix_ipc或sysv_ipc Python模塊提供了一個命名的信號量類。您可以將信號量初始化爲1,並讓所有Web進程在向USB設備發送命令時獲取信號量。
使用文件鎖定可以實現某種類似的機制,可能使用fcntl.lockf。
另一種完全不同的方法可能是在Web服務器進程和USB API之間建立一個新進程。該過程公開了一個API,該API接收來自Web服務器工作人員的請求,並通過單線程過程將這些請求隱式串行化到USB設備中。
我試過posix_ipc。我同時運行了該程序的兩個實例,它讓我獲得了兩個信號量。這是正常的嗎?在這種情況下posix_ipc或sysv_ipc不能解決我的問題。 http://pastebin.com/RWHptWyd – tiktak
我有'fcntl.lockf'工作很容易。一個人應該小心,不要讓它永久鎖定在錯誤的情況下(這適用於大多數解決方案)。 – tiktak
當您將第三個參數設置爲1時,您不會將信號量計數初始化爲1)。你的測試可以獲取信號量是很奇怪的,在我看來,你粘貼的代碼在任何情況下都不應該通過,因爲信號量開始被鎖定。請注意''aquire'遞減計數,'release'遞增計數。 – Miguel
不完全是你的問題的答案,但也許有關如何解決這個問題的另一個想法與使用全局。
爲什麼不寫一個控制USB設備的小程序?此腳本在您的服務器上運行一次(一次),並以您需要的方式與設備通信。它還處理併發問題。
現在通過管道,套接字與您的Web應用程序進行通信,通過此腳本進行通信,向其發送命令並從中接收結果。
你可以一個variabale添加到您的配置(確保其大寫)
app.config['YOUR_GLOBAL'] = 'your global'
對不起,我只是試過了,這不起作用。我的測試是這樣的:如果它不存在,將全局設置爲False,否則獲得價值。全球從來都不存在於每一個新的會議中,所以它不會像我問的那樣被所有會議共享。 – tiktak
你有沒有考慮使用鎖文件? –
這將是很好,很簡單,但人們必須小心有一個「安全技巧」,如定時器,以避免資源因錯誤而永久鎖定。 – tiktak
是的,對於任何文件鎖定機制都是如此。您可以在鎖文件中寫入進程的PID,並在嘗試獲取鎖時檢查它是否仍在運行,並在必要時實現額外的超時機制。 –