Bir Rails uygulaması yazmak zorundayım çünkü Rails işleminde bir Neo4j grafik veritabanını içeren Neo4j.rb'nin üzerinde çalışıyorum ve böylece aynı süreçten birden fazla istekte bulunmak zorundayım. Evet, SQL veritabanları gibi çalıştı bir Neo4j veritabanına bağlarsanız, ama olurdu, bu yüzden şikayet bırakacağım ve sadece kullanacağız.Thread-safe Denetleyici eylemlerini yönlendirir - örnek değişkenleri belirleme?
Eşzamanlı kod yazmanın etkileri konusunda oldukça endişeliyim (olması gerektiği gibi) ve ortak bir senaryoyu nasıl ele alacağımız konusunda biraz tavsiyeye ihtiyacım var - bir denetleyici bir örnek değişkenini veya oturum karma değişkenini bir değişken olarak ayarlar sonra bazı şeyler olur.
# 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
soru: Bu kodun herhangi yarış koşulları var mıdır ne demek istediğimi göstermek için aşağıdaki ham kodunu düşünün?
SessionsController'da session
hash ve params
hash thread-local? Aynı tarayıcı oturumunda, farklı kimlik bilgileriyle/session'larının oluşturulmasında (Rails route sözdizimini ödünç almak için) birden fazla istekte bulunulduğunu varsayalım, oturum açmış olan kullanıcı en son session[:current_user_id] = user.id
numaralı satıra ulaşan istek olmalıdır. Yoksa denetleyici eyleminin etrafında bir mutex kilit mi sarmalıyım?
CurrentUserController'da, show eylemi farklı oturumlarda iki istekle eşzamanlı olarak vurulursa, aynı @current_user değişkeni her ikisi tarafından ayarlanacak mı? Yani .html.erb dosyasını işlerken ilk istek, @current_user örnek değişkenin aniden ikinci iş parçacığı tarafından değiştirildiğini görecek mi?
Teşekkür
Bu eski bir ileti dizisidir, üzgünüz. Ama ben bir takip yapıyorum. Bu çok mantıklı (ve neden insanlar denetleyici yöntemlerinde @ variables hakkında endişe etmiyorlar. Ancak bu doğruysa, bu adamın her birinin kendi sayacıyla ilgili sorunları olduğu konusunda kafam karıştı. Http://tenderlovemaking.com/2012/ 06/18/remove-config-threadsafe.html –
@OliverShaw, bu post sayacı bir sınıf örneği değişkendir (çünkü "class << self' bloğundadır), bu nedenle tüm istekler aynı sayacı değiştirerek olurdu –
Coming Ruby'ye geri dönelim: Sınıf değişkenlerini değil, sınıf değişkenlerini hatırladım.Çok teşekkürler! –