2011-11-04 9 views
6

हम रेल और इवेंटमैचिन का एक साथ उपयोग करते हैं, और यात्री के साथ उस कॉम्बो का उपयोग करते समय कुछ बहुत ही विशिष्ट सेटअप किए जाने की आवश्यकता होती है। बहुत सारे परीक्षण और त्रुटि के बाद, मुझे इवेंटमैचिन प्रारंभिकता अच्छी तरह से काम कर रही है, लेकिन मैं कोड को थोड़ा बेहतर समझना चाहता हूं। जैसा कि आप इस कोड स्निपेट में नीचे देख सकते हैं, हमारा प्रारंभकर्ता पैसेंजर के लिए जांच करता है, और तब जांच करता है कि यह EventMachine को पुनरारंभ करने से पहले एक फोर्क प्रक्रिया है या नहीं।इवेंटमैचिन और रूबी थ्रेड - वास्तव में यहां क्या चल रहा है?

if defined?(PhusionPassenger) 
    PhusionPassenger.on_event(:starting_worker_process) do |forked| 
    # for passenger, we need to avoid orphaned threads 
    if forked && EM.reactor_running? 
     EM.stop 
    end 
    Thread.new { 
     EM.run do 

मेरा प्रश्न EM.reactor_running से संबंधित है? और ईएम.स्टॉप आदेश। अगर यात्री ने हमारी प्रक्रिया को फोर्क किया है, तो मुझे एक नए धागे में ईएम संदर्भ को पुनरारंभ करने की आवश्यकता क्यों है? अगर EM.reactor_running? सच हो जाता है, मैं किस ईएम उदाहरण का संदर्भ दे रहा हूं?

आप हमारे ब्लॉग यहाँ http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

उत्तर

13

सबसे पहले पर पूर्ण प्रारंभकर्ता कोड देख सकते हैं, वहाँ रूबी प्रक्रिया में केवल एक EventMachine उदाहरण है, तो कोई बात नहीं क्या आप एक ही ईएम उदाहरण संदर्भ हमेशा होगा, के स्वतंत्र वर्तमान में अपने धागे को

आप रिएक्टर को एक नए, अलग धागे में चलाते हैं ताकि यह मुख्य धागे को अवरुद्ध न करे (जिसका उद्देश्य वेब अनुरोध की सेवा करना है)। EM.run अन्यथा नियंत्रण को ले जाएगा, अपने रन लूप में प्रवेश करेगा, अब EM.run ब्लॉक को नहीं छोड़ देगा। EM.reactor_running? सच है, ठीक है, अगर कोई ईएम पाश कहीं चल रहा है। चूंकि रूबी प्रक्रिया में केवल एक ही है, यदि ईएम चल रहा है या नहीं, तो यह पता लगाने के लिए पर्याप्त आसान है।

आपके पास जो सेटअप है, वह सामान्य रूबी प्रक्रिया के अंदर ईएम का उपयोग करने का सबसे आसान तरीका है जो चल रहा है और बाकी सब कुछ के साथ हस्तक्षेप किए बिना। मुझे लगता है कि आप अपने वेब ऐप से एएमक्यूपी ब्रोकर को संदेश धक्का दे रहे हैं। जब भी आप एक संदेश भेजते हैं, तो यह अलग थ्रेड में ईएम के रन लूप में जाएगा, वह हिस्सा आपके लिए बहुत पारदर्शी है, और मुख्य लूप को प्रभावित नहीं करता है, जो रेल वेब अनुरोध को संभालने में जारी रख सकता है। EM.next_tick का उपयोग करके चीजों को हमेशा ईएम लूप पर धक्का देने के लिए सावधान रहें। विभिन्न धागे में ईएम द्वारा खोले गए सॉकेट को संभालने का प्रयास करने से बुरी चीजें हो सकती हैं, जो मैंने उत्पादन में देखा है, आकस्मिक रूप से होने वाली लाइब्रेरी का उपयोग करके और निर्माण करके;)

एक नया शुरू करने से पहले ईएम पाश को रोकना एक ईएम लूप का जो माता-पिता प्रक्रिया से छोड़ा जा सकता है, जिसके परिणामस्वरूप ईएम का उपयोग करके, मूल प्रक्रिया में फ़ाइल डिस्क्रिप्टर खोले जाने में समस्याएं हो सकती हैं। कस्टम कोड में इसे EM.fork_reactor का उपयोग करके अवरुद्ध किया जा सकता है, लेकिन जैसा कि मूल प्रक्रिया आपके नियंत्रण से बाहर है, यह जांचने के लिए सबसे सुरक्षित है कि कोई रिएक्टर मौजूद है या नया उदाहरण शुरू करने से पहले इसे रोकें।

+0

ग्रेट विवरण धन्यवाद। मैं अपने स्वयं के धागे में ईएम चलाने की आवश्यकता पर स्पष्ट हूं, लेकिन जब आप कहते हैं कि "ईएम लूप जिसे छोड़ा जा सकता है", वहीं मैं थोड़ा अस्पष्ट हूं। ईएम लूप कैसे "छोड़ दिया" मिलता है? मैं माता-पिता की प्रक्रिया को बंद नहीं कर रहा हूं 'ईएम, सही? – Joshua

+0

यह वही है जो आप कर रहे हैं। आप मूल प्रक्रिया से ईएम पर संभावित रूप से बाएं बंद कर रहे हैं। माता-पिता की प्रक्रिया में ईएम लूप चलाना चाहिए, इसे भी फोर्क किया जाएगा, लेकिन आमतौर पर आप माता-पिता से छोड़े गए फ़ाइल डिस्क्रिप्टर में दिलचस्पी नहीं रखते हैं, इसलिए आप इसके बजाय स्क्रैच से शुरू करते हैं। यह देखते हुए कि यात्री स्वयं ईएम लूप चलाने की संभावना नहीं है, यह किसी और चीज की तुलना में सुरक्षा उपाय से अधिक है। – roidrage

+0

इसी तरह की नस में, मैं रूबी-एमक्यूपी मणि के माध्यम से खरगोश के नीचे चल रहे एक वेबसाइकिल ऐप के भीतर खरगोश एमक्यू के साथ काम कर रहा हूं। पतला का अपना इवेंटमैचिन लूप जा रहा है, और मैं वर्तमान में EventMachine.next_tick का उपयोग कर रहा हूं और मेरी amqp सामग्री को करने के लिए कर रहा हूं। क्या यह सही है या क्या मुझे एएमक्यूपी का उपयोग करने के लिए अपना स्वयं का ईएम देने के लिए EventMachine.fork_reactor का उपयोग करना चाहिए? – wchrisjohnson

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