這是一個非常基本的併發問題。Ruby變量的Threadsafety?
在Ruby中,是安全的假設,存儲在本地變量的任何狀態是線程安全的?
具體來說,我想在一個Rails應用程序的請求。如果我要在User類中存儲狀態,我認爲這會要求併發問題。但是,如果我實例化一個用戶(例如,請求在設計current_user
方法,假設方法不使用一個全球性的引擎罩下自己的狀態),我從來沒有給該用戶指定一個全局變量或常量,我應該能夠修改該實例的狀態而不關心線程安全性,對嗎?
這是一個非常基本的併發問題。Ruby變量的Threadsafety?
在Ruby中,是安全的假設,存儲在本地變量的任何狀態是線程安全的?
具體來說,我想在一個Rails應用程序的請求。如果我要在User類中存儲狀態,我認爲這會要求併發問題。但是,如果我實例化一個用戶(例如,請求在設計current_user
方法,假設方法不使用一個全球性的引擎罩下自己的狀態),我從來沒有給該用戶指定一個全局變量或常量,我應該能夠修改該實例的狀態而不關心線程安全性,對嗎?
基本上,你是對的,單個請求裏,你可以放心地使用任何局部變量,除非你自己產卵的線程。
此外,如果你使用像麒麟服務器使用爲你「線程」處理請求工人(獨立進程)的每個進程住在自己的內存空間,只有一個請求是在同一時間被處理。如果你有一個像彪馬可以處理一個Ruby進程內並行的多個請求線程的服務器可能會出現
問題。這是競態條件可能會開始,如果你有一個像代碼:
class User
delf.self.current_user
@@current_user
end
end
User.current_user.destroy
的@@current_user
變量可以通過並行處理得到改變,你可以不小心破壞錯誤的用戶。
即使你給的例子在多進程(而不是多線程)模型中也是安全的,對嗎? –
是的,這是正確的 –
我不確定是否應該指定一個Ruby實現;我知道他們支持多線程...... –