我有一個共享資源,一次只能由一個會話使用,我如何向其他會話發出資源當前正在使用的信號?Rails 3.2如何保護跨會話的共享資源訪問
在Java或C中,我會使用互斥信號量來協調線程之間的關係,我如何在Rails中完成這項工作?我是否定義了新的環境變量並使用它來在會話之間進行協調?
一小段代碼片段連同答案將非常有幫助。
我有一個共享資源,一次只能由一個會話使用,我如何向其他會話發出資源當前正在使用的信號?Rails 3.2如何保護跨會話的共享資源訪問
在Java或C中,我會使用互斥信號量來協調線程之間的關係,我如何在Rails中完成這項工作?我是否定義了新的環境變量並使用它來在會話之間進行協調?
一小段代碼片段連同答案將非常有幫助。
由於你的Rails實例可以在不同的處理使用的Nginx或Apache(沒有共享存儲器等中的線程)時運行,我想唯一的解決辦法是使用文件鎖:
lock = File.new("/lock/file")
begin
lock.flock(File::LOCK_EX)
# do your logic here, or share information in your lock file
ensure
lock.flock(File::LOCK_UN)
end
謝謝你會檢查出來。 – user1394236
此解決方案假定您只在單臺計算機上鎖定多個進程。如果您擁有多個應用程序服務器而不是您已經洗過在這種情況下,我會查看共享資源(hah),例如redis或memcache。設置一個標誌,說明哪個機器/進程正在鎖定某個資源,然後讓所有其他「客戶」檢查該標誌。 –
Ruby有一個Mutex class那可能會做你想做的事,儘管它不會跨越流程。我很抱歉,但我不知道給你一個示例代碼片段。以下是文檔所述:「互斥體實現了一個簡單的信號量,可用於協調對來自多個併發線程的共享數據的訪問。」
感謝不知道mutrx類,將檢查出來。 – user1394236
'Mutex'不是Rails的一部分,它是Ruby的一部分。該文檔也有點舊,[新文檔在這裏](http://ruby-doc.org/core-1.9.3/Mutex.html)。此外,這不會跨進程使用,所以對於OP在Web服務器上的目的而言,它通常是無用的。 –
謝謝安德魯,我更新了答案,以便更加正確。 – GorrillaMcD
取決於資源是什麼。也許它提供了原生鎖定?您需要提供更多詳細信息/背景信息。 –
對於某些會話,用戶可以選擇控制共享資源。如果用戶請求訪問,那麼我想檢查並查看是否正在使用資源,在這種情況下建立一個拒絕訪問的對話框,如果可用,則將資源標記爲正在使用,並讓新用戶繼續前進並使用它。當會話檢查資源是否被使用時,在這種情況下釋放它。 – user1394236
您正在使用Rails,那麼爲什麼不創建一個帶鎖屬性的模型? – christianblais