2012-12-25 6 views
20

परीक्षण के लिए तैयार: sleep 10 एक कार्रवाई मेंएक ही समय में बहु-अनुरोधों को कैसे हल किया जाता है?

टेस्ट: ब्राउज़र में खोलें दो टैब कार्रवाई का दौरा करने के

परिणाम: जब दूसरा अनुरोध चल रहा है, पहला अनुरोध समाप्त हो गया और दृश्य को प्रस्तुत करना शुरू किया, लेकिन दृश्य अभी भी खाली है। दूसरे अनुरोध के बाद भी, दो अनुरोध एक ही समय में दृश्य प्रस्तुत करना समाप्त कर दिया।

निष्कर्ष: रेल केवल एक ही उदाहरण है। एक अनुरोध केवल पिछले अनुरोध खत्म होने के बाद ही कार्रवाई दर्ज कर सकता है। लेकिन प्रतिक्रिया भाग को कैसे समझाया जाए? बहु-अनुरोध एक ही समय में विचारों को प्रस्तुत करने का अंत क्यों करते हैं?

उत्तर

4

क्या आप WEBrick सर्वर का उपयोग कर रहे हैं? ऐसा इसलिए होना चाहिए क्योंकि आपका सर्वर एक थ्रेडेड सर्वर है और एक समय में एक अनुरोध को पूरा करने में सक्षम है (एकल कार्यकर्ता थ्रेड के कारण)। अब एकाधिक अनुरोधों के मामले में, यह अनुरोध के क्रिया भाग को चलाता है और दृश्य प्रस्तुतकर्ता चलाने से पहले यह जांचता है कि कोई लंबित अनुरोध है या नहीं। अब अगर 10 अनुरोधों को रेखांकित किया गया है, तो यह वास्तव में विचारों को प्रस्तुत करने से पहले उन सभी को पूरा करेगा। जब इन सभी अनुरोधों को पूरा कर लिया जाता है, तो विचारों को क्रमशः प्रस्तुत किया जाएगा।

यदि आप बहु-थ्रेडेड वातावरण चाहते हैं तो आप यात्री या यूनिकॉर्न सर्वर पर स्विच कर सकते हैं।

आशा है कि यह समझ में आता है।

+0

धन्यवाद, तुम मुझे कम उलझन में हैं। मैं एक ही समय में अधिक अनुरोधों के साथ परीक्षण करता हूं, ऐसा लगता है कि 10 से कम अनुरोधों को रेखांकित करने के बाद, Webrick विचार प्रस्तुत करेगा और फिर अन्य अनुरोधों को हल करेगा। –

+0

मुझे लगता है कि Webrick एक थ्रेडेड सर्वर नहीं है, आप 'config.threadsafe' सेट कर सकते हैं! उत्पादन.आरबी में, फिर यह एक ही समय में बहु-अनुरोधों को हल करेगा। –

+0

'config.threadsafe!' स्वचालित रूप से WEBrick बहु-थ्रेडेड नहीं बनायेगा।विवरण के लिए मेरा जवाब देखें। – Nowaker

19

वेबब्रिक बहु-थ्रेडेड है लेकिन रेल डेवलपर्स एक म्यूटेक्स को कड़ी-कोडित करते हैं, इसलिए यह एक समय में केवल एक अनुरोध को संभाल सकता है। आप बंदर-पैच Rails::Server कर सकते हैं और आप एक बहु थ्रेडेड वेबब्रिक चलाने के लिए स्वतंत्र हैं।

बस ध्यान दें कि कॉन्फ़िगरेशन config.cache_classes = true और config.eager_load = true पर कॉन्फ़िगर किया जाएगा, जो RAILS_ENV=production के लिए विशिष्ट है। ऐसा इसलिए है क्योंकि विकास में कक्षा रीलोडिंग थ्रेड सुरक्षित नहीं है।

प्राप्त करने के लिए WEBrick पूरी तरह से मल्टी-थ्रेडेड रेल 4.0 में, बस इस config/initializers/multithreaded_webrick.rb में जोड़ें:

# Remove Rack::Lock so WEBrick can be fully multi-threaded. 
require 'rails/commands/server' 

class Rails::Server 
    def middleware 
    middlewares = [] 
    middlewares << [Rails::Rack::Debugger] if options[:debugger] 
    middlewares << [::Rack::ContentLength] 

    Hash.new middlewares 
    end 
end 

rails/commands/server.rb में अपमानजनक कोड नहीं है कि हम से छुटकारा मिला है:

# FIXME: add Rack::Lock in the case people are using webrick. 
# This is to remain backwards compatible for those who are 
# running webrick in production. We should consider removing this 
# in development. 
if server.name == 'Rack::Handler::WEBrick' 
    middlewares << [::Rack::Lock] 
end 

यह आवश्यक नहीं है रेल 4.2 पर। यह समवर्ती आउट ऑफ़ द बॉक्स है।

+0

जोड़ा गया, लेकिन अभी भी 'रैक :: लॉक' को मिडलवेयर – geekazoid

+1

@geekazoid, रेल 4.1 में जोड़ता है मुझे लगता है? मैंने इसे केवल रेल 4.0 पर परीक्षण किया। मैं देखूंगा कि 4.1 में इसे कैसे किया जाए। – Nowaker

+0

क्या यह 'config.allow_concurrency = true' जोड़ना हल हो गया है? – geekazoid

0
अपने env सेटअप config/वातावरण/development.rb (या config/application.rb में)

इस लाइन को जोड़ने के नीचे

:

#Enable threaded mode 
    config.threadsafe! 
+1

यह विकल्प अब आवश्यक/समर्थित नहीं है (कम से कम रेल 4 के बाद से)। विवरण के लिए http://tenderlovemaking.com/2012/06/18/removing-config-threadsafe.html देखें – ToniTornado

संबंधित मुद्दे