我必須編寫一個線程Rails應用程序,因爲我在Neo4j.rb之上運行它,它在Rails進程中嵌入了一個Neo4j圖形數據庫,因此我必須提供來自同一進程的多個請求。是的,如果連接到像SQL數據庫那樣工作的Neo4j數據庫會很酷,但它不會,所以我會放棄抱怨並使用它。線程安全的Rails控制器操作 - 設置實例變量?
我很擔心編寫併發代碼的影響(我應該是這樣),並且只需要一些關於如何處理常見的常見場景的建議 - 控制器在會話散列中設置實例變量或變量,然後發生一些事情。請看下面的原油代碼來證明我的意思:
# THIS IS NOT REAL PRODUCTION CODE
# I don't do this in real life, it is just to help me ask my question, I
# know about one-way hashing, etc.!
class SessionsController
def create
user = User.find_by_email_and_password(params[:email], params[:password])
raise 'auth error' unless user
session[:current_user_id] = user.id
redirect_to :controller => 'current_user', :action => 'show'
end
end
class CurrentUserController
def show
@current_user = User.find(session[:current_user_id])
render :action => :show # .html.erb file that uses @current_user
end
end
的問題:有沒有在此代碼的任何競爭條件?
在SessionsController中,是session
哈希和params
哈希線程本地?假設同一個瀏覽器會話使用不同的憑證向/ sessions#create(要借用Rails路由語法)發出多個請求,那麼登錄的用戶應該是最後一行到達session[:current_user_id] = user.id
的請求?或者我應該圍繞控制器操作包裝一個互斥鎖?
在CurrentUserController中,如果show動作被兩個具有不同會話的請求同時命中,相同的@current_user變量是由兩者設置的嗎?即第一個請求會在處理.html.erb文件時發現它的@current_user實例變量突然被第二個線程改變了嗎?
感謝
這是一個古老的線程,抱歉。但我有一個後續。這很有意義(以及爲什麼人們不會在控制器方法中擔心@variables,但如果這是真的,我很困惑這傢伙每個人的計數器都有問題http://tenderlovemaking.com/2012/ 06/18/removed-config-threadsafe.html – 2017-02-12 13:19:27
@OliverShaw在該計數器中是一個類實例變量(因爲它在'class << self'塊中),所以所有的請求都會修改同一個計數器 – 2017-02-12 13:41:32
即將到來回到Ruby。我記得類變量,但沒有類實例變量。謝謝! – 2017-02-12 14:20:42