2013-08-06 37 views
1

我希望能夠使用來自多個應用程序的USB設備(例如我運行一個Flask Web應用程序),確保一次只有一個使用它。如何防止對USB設備等資源的併發訪問?

在我的情況下,我正在使用一個繼電器打開/關閉一扇門。門大約需要20秒才能打開。在此期間,繼電器不應該被激活,因爲這會將門鎖在中間。

在此先感謝!

+0

你有沒有考慮使用鎖文件? –

+0

這將是很好,很簡單,但人們必須小心有一個「安全技巧」,如定時器,以避免資源因錯誤而永久鎖定。 – tiktak

+0

是的,對於任何文件鎖定機制都是如此。您可以在鎖文件中寫入進程的PID,並在嘗試獲取鎖時檢查它是否仍在運行,並在必要時實現額外的超時機制。 –

回答

0

您有許多可能的解決方案。

posix_ipcsysv_ipc Python模塊提供了一個命名的信號量類。您可以將信號量初始化爲1,並讓所有Web進程在向USB設備發送命令時獲取信號量。

使用文件鎖定可以實現某種類似的機制,可能使用fcntl.lockf

另一種完全不同的方法可能是在Web服務器進程和USB API之間建立一個新進程。該過程公開了一個API,該API接收來自Web服務器工作人員的請求,並通過單線程過程將這些請求隱式串行化到USB設備中。

+0

我試過posix_ipc。我同時運行了該程序的兩個實例,它讓我獲得了兩個信號量。這是正常的嗎?在這種情況下posix_ipc或sysv_ipc不能解決我的問題。 http://pastebin.com/RWHptWyd – tiktak

+0

我有'fcntl.lockf'工作很容易。一個人應該小心,不要讓它永久鎖定在錯誤的情況下(這適用於大多數解決方案)。 – tiktak

+0

當您將第三個參數設置爲1時,您不會將信號量計數初始化爲1)。你的測試可以獲取信號量是很奇怪的,在我看來,你粘貼的代碼在任何情況下都不應該通過,因爲信號量開始被鎖定。請注意''aquire'遞減計數,'release'遞增計數。 – Miguel

1

不完全是你的問題的答案,但也許有關如何解決這個問題的另一個想法與使用全局。

爲什麼不寫一個控制USB設備的小程序?此腳本在您的服務器上運行一次(一次),並以您需要的方式與設備通信。它還處理併發問題。

現在通過管道,套接字與您的Web應用程序進行通信,通過此腳本進行通信,向其發送命令並從中接收結果。

+0

如何處理進程之間通信的「管道」(我認爲在UNIX shell管道中,由'pipes'模塊定義?)如何分別啓動?例如,我將用啓動腳本('init.d')啓動USB控制程序,並使用'mod_wsgi'運行我的web應用程序。 – tiktak

+0

有各種各樣的替代品。在谷歌上尋找蟒蛇經紀人,你會看到一些。第一個結果是rabbitmq,一個與Python合作的流行的結果。 –

+0

謝謝!我選擇了另一個答案作爲接受的答案,但這沒有任何意義。你的想法與衆不同,你的想法也非常好。我可能更喜歡它,因爲我可能會得到其他要求。 – tiktak

0

你可以一個variabale添加到您的配置(確保其大寫)

app.config['YOUR_GLOBAL'] = 'your global' 

http://flask.pocoo.org/docs/config/

+0

對不起,我只是試過了,這不起作用。我的測試是這樣的:如果它不存在,將全局設置爲False,否則獲得價值。全球從來都不存在於每一個新的會議中,所以它不會像我問的那樣被所有會議共享。 – tiktak

相關問題