2012-08-17 16 views
10

मुझे थ्रेडेड रेल ऐप लिखना है क्योंकि मैं इसे Neo4j.rb के ऊपर चला रहा हूं, जो रेल प्रक्रिया के अंदर एक नियो 4 जी ग्राफ डेटाबेस एम्बेड करता है, और इस प्रकार मुझे उसी प्रक्रिया से कई अनुरोधों को पूरा करना होगा। हाँ, यह अच्छा होगा अगर Neo4j डेटाबेस से कनेक्ट करने से SQL डेटाबेस की तरह काम किया जाता है, लेकिन ऐसा नहीं होता है, इसलिए मैं शिकायत छोड़ दूंगा और इसका उपयोग करूँगा।थ्रेड-सुरक्षित रेल नियंत्रक क्रियाएं - उदाहरण आवृत्ति सेट करना?

मैं समवर्ती कोड (जैसा कि मुझे होना चाहिए) लिखने के प्रभावों के बारे में काफी चिंतित हूं, और सामान्य सामान्य परिदृश्य को संभालने के तरीके पर कुछ सलाह चाहिए - नियंत्रक एक उदाहरण चर या सत्र हैश में एक चर सेट करता है , तो कुछ चीजें होती हैं।

# 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 

प्रश्न: इस कोड में किसी भी जाति की स्थिति प्रदर्शित करने के लिए कर रहे हैं कि मैं क्या मतलब निम्नलिखित कच्चे कोड पर विचार करें?

सत्र नियंत्रक में, session हैश और params हैश थ्रेड-लोकल हैं? मान लें कि एक ही ब्राउज़र सत्र अलग-अलग प्रमाण-पत्रों के साथ/सत्र # बनाने (रेल मार्ग सिंटैक्स उधार लेने के लिए) के लिए कई अनुरोध करता है, लॉग इन करने वाले उपयोगकर्ता को अनुरोध होना चाहिए कि पिछले session[:current_user_id] = user.id पंक्ति को हिट करें? या क्या मुझे नियंत्रक कार्रवाई के चारों ओर एक म्यूटेक्स लॉक लपेटना चाहिए?

CurrentUserController में, यदि अलग-अलग सत्रों के साथ दो अनुरोधों के साथ शो एक्शन एक साथ मारा जाता है, तो क्या वही @current_user चर दोनों द्वारा सेट किया जाएगा? अर्थात। पहला अनुरोध होगा, क्योंकि यह .html.erb फ़ाइल को संसाधित कर रहा है, यह पता लगाएं कि यह @current_user इंस्टेंस वैरिएबल को दूसरे थ्रेड द्वारा अचानक बदल दिया गया है?

धन्यवाद

उत्तर

10

प्रत्येक अनुरोध एक new instance of your controller हो जाता है। परिणामस्वरूप नियंत्रक आवृत्ति चर धागे सुरक्षित हैं। params और session भी नियंत्रक आवृत्ति चर (या अनुरोध ऑब्जेक्ट स्वयं) द्वारा समर्थित हैं और इसलिए भी सुरक्षित हैं।

+0

यह एक पुराना धागा है, क्षमा करें। लेकिन मेरे पास एक फॉलो अप है। इससे बहुत समझदारी होती है (और क्यों लोग कंट्रोलर विधियों में @ variables के बारे में चिंता नहीं करते हैं। हालांकि अगर यह सच है, तो मैं इस बात से उलझन में हूं कि इस लड़के को अपने काउंटर के साथ समस्याएं कैसे थीं http://tenderlovemaking.com/2012/ 06/18/हटाने-config-threadsafe.html –

+1

@ पोस्टर काउंटर में @ ओलिवरशॉ एक क्लास इंस्टेंस वैरिएबल है (क्योंकि यह 'क्लास << स्वयं' ब्लॉक में है), इसलिए सभी अनुरोध एक ही काउंटर –

+0

आ रहे हैं रूबी पर वापस। मुझे क्लास वेरिएबल्स याद आएगा, लेकिन क्लास इंस्टेंस वैरिएबल नहीं। धन्यवाद! –

2

यह जानना महत्वपूर्ण है कि धागे और क्या नहीं है के बीच साझा किया जाता है।

अब अपने विशिष्ट उदाहरण पर वापस जाएं। दो अनुरोध CurrentUserController#show एक साथ हिट करते हैं, इसलिए उन्हें दो समवर्ती धागे से नियंत्रित किया जाता है। यहां कुंजी यह है कि प्रत्येक थ्रेड का अपना उदाहरण CurrentUserController है, इसलिए दो @current_user वेरिएबल्स हैं जो हस्तक्षेप नहीं करते हैं। तो @current_user के आसपास कोई दौड़ स्थिति नहीं है।

रेस स्थिति का एक उदाहरण इस होगा: जीआईएल (ग्लोबल दुभाषिया लॉक) की वजह से

class ApplicationController < ActionController::Base 
    before_each :set_current_user 
    cattr_accessor :current_user 

    def set_current_user 
    self.class.current_user = User.find_by_id(session[:current_user_id]) 
    end 
end 

# model 
class LogMessage < ActiveRecord::Base 
    belongs_to :user 

    def self.log_action(attrs) 
    log_message = new(attrs) 
    log_message.user = ApplicationController.current_user 
    log_message.save 
    end 
end 

अधिक सामान्य टिप्पणी पर, एमआरआई रूबी में धागे का उपयोग करने से लाभ नहीं बल्कि सीमित हैं। ऐसे कार्यान्वयन हैं जो जीआईएल (जर्बी) से मुक्त हैं।

+0

उदाहरण के लिए धन्यवाद, हालांकि मुझे पहले से ही पता है कि कक्षा चर एक दौड़ का कारण बनेंगे। जीआईएल मुद्दे पर, मुझे लगता है कि आप गलत हैं - रुबी 1.9 धागे मूल हैं, और मैं वैसे भी JRuby का उपयोग कर रहा हूं। –

+1

मुझे खुशी है कि आप सही रास्ते पर हैं। एमआरआई रूबी 1 के लिए।9: इसमें मूल धागे और जीआईएल हैं, जो उन मूल धागे द्वारा उपयोग किए जाने वाले वैश्विक म्यूटेक्स हैं। –

+0

आह, मैं देखता हूं। खैर, जैसा कि मैंने कहा, शुक्र है कि मैं JRuby का उपयोग कर रहा हूँ :) –