Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

मास्टरींग संगामिति

एकता में महारत हासिल करना

एक ही समय में कई लोग आपके ऐप का उपयोग करेंगे, और आप अपने ऐप को जल्द से जल्द डिलीवर करना चाहते हैं। तो आपको समेकन को संभालने के लिए किसी तरह की आवश्यकता होगी। डर नहीं! अधिकांश वेब सर्वर पहले से ही डिफ़ॉल्ट रूप से ऐसा करते हैं। लेकिन जब आपको स्केल करने की आवश्यकता होती है, तो आप संगामिति का सबसे कुशल तरीके से उपयोग करना चाहते हैं।

विभिन्न प्रकार की समवर्ती

समवर्ती को संभालने के कई तरीके हैं:बहु-प्रक्रिया, बहु-थ्रेडिंग और घटना-संचालित। इनमें से प्रत्येक के अपने उपयोग, पक्ष और विपक्ष हैं। इस लेख में, आप सीखेंगे कि वे कैसे भिन्न हैं और किसका उपयोग कब करना है।

<हेडर क्लास ="रूबी_मैजिक" आईडी ="मल्टी-प्रोसेस">

बहु-प्रक्रिया (यूनिकॉर्न)

समवर्ती को संभालने का यह सबसे आसान तरीका है। एक मास्टर प्रक्रिया कई कार्यकर्ता प्रक्रियाओं के लिए खुद को फोर्क करती है। कार्यकर्ता प्रक्रिया वास्तविक अनुरोधों को संभालती है, जबकि मास्टर श्रमिकों का प्रबंधन करता है।

प्रत्येक कार्यकर्ता प्रक्रिया में मेमोरी में पूर्ण कोडबेस होता है। यह इस पद्धति को काफी मेमोरी-इंटेंसिव बनाता है, और बड़े इन्फ्रास्ट्रक्चर को स्केल करना कठिन बनाता है।

बहु-प्रक्रिया सारांश
केस का उपयोग करें एक गैर-रूबी उदाहरण जो आप शायद जानते हैं वह है क्रोम ब्राउज़र। यह प्रत्येक टैब को अपनी प्रक्रिया देने के लिए बहु-प्रक्रिया संगामिति का उपयोग करता है। यह एकल टैब को पूर्ण एप्लिकेशन को नीचे ले जाए बिना क्रैश होने देता है। उनके मामले में, यह शोषण को एक टैब में अलग करने में भी मदद करता है।
पेशेवरों कार्यान्वयन में सबसे सरल।
थ्रेड सुरक्षा के साथ कठिनाइयों को अनदेखा करता है।
प्रत्येक कार्यकर्ता शेष सिस्टम को नुकसान पहुंचाए बिना क्रैश कर सकता है।
विपक्ष हर प्रक्रिया मेमोरी में पूरा कोडबेस लोड करती है। यह इसे मेमोरी-इंटेंसिव बनाता है।
इसलिए, यह बड़ी मात्रा में समवर्ती कनेक्शन को स्केल नहीं करता है।
<हेडर क्लास ="रूबी_मैजिक" आईडी ="मल्टी-थ्रेडिंग">

मल्टी-थ्रेडिंग (प्यूमा)

यह थ्रेडिंग मॉडल एक प्रक्रिया को एक ही समय में कई अनुरोधों को संभालने की अनुमति देता है। यह एक ही प्रक्रिया में कई थ्रेड चलाकर ऐसा करता है।

बहु-प्रक्रिया दृष्टिकोण के विपरीत, सभी धागे एक ही प्रक्रिया के भीतर चलते हैं। इसका मतलब है कि वे वैश्विक चर जैसे डेटा साझा करते हैं। इसलिए, प्रति थ्रेड केवल अतिरिक्त मेमोरी के छोटे हिस्से का उपयोग किया जाता है।

वैश्विक दुभाषिया लॉक

यह हमें MRI में ग्लोबल इंटरप्रेटर लॉक (GIL) में लाता है। GIL सभी रूबी कोड के निष्पादन के आसपास एक ताला है। भले ही हमारे थ्रेड समानांतर में चलते हुए दिखाई देते हैं, लेकिन एक समय में केवल एक थ्रेड सक्रिय होता है।

IO GIL के बाहर काम करता है। जब आप परिणाम के वापस आने की प्रतीक्षा में डेटाबेस क्वेरी निष्पादित करते हैं, तो यह लॉक नहीं होगा। इस बीच एक और सूत्र को कुछ काम करने का मौका मिलेगा। यदि आप धागे में हैश या सरणियों पर बहुत सारे गणित और संचालन करते हैं, तो आप केवल एक ही कोर का उपयोग करेंगे यदि आप एमआरआई का उपयोग करते हैं। ज्यादातर मामलों में आपको अपनी मशीन का पूरी तरह से उपयोग करने के लिए अभी भी कई प्रक्रियाओं की आवश्यकता होती है। या आप रुबिनियस या jRuby का उपयोग कर सकते हैं, जिसमें GIL नहीं है।

थ्रेड सुरक्षा

यदि आप एकाधिक धागे का उपयोग करते हैं तो आपको थ्रेड सुरक्षित तरीके से साझा डेटा में हेरफेर करने वाले सभी कोड लिखने में सावधानी बरतनी होगी। उदाहरण के लिए आप साझा डेटा संरचनाओं में हेरफेर करने से पहले उन्हें लॉक करने के लिए म्यूटेक्स का उपयोग करके ऐसा कर सकते हैं। यह सुनिश्चित करेगा कि जब आप डेटा बदल रहे हों तो अन्य थ्रेड अपने काम को पुराने डेटा पर आधारित नहीं कर रहे हैं।

मल्टी-थ्रेडेड सारांश
केस का उपयोग करें यह "सड़क के बीच में" विकल्प है। बहुत सारे मानक वेब अनुप्रयोगों के लिए उपयोग किया जाता है जो छोटे अनुरोधों (जैसे एक व्यस्त वेब एप्लिकेशन) के भार को संभालना चाहिए।
पेशेवरों मल्टी-प्रोसेस की तुलना में कम मेमोरी का उपयोग करता है।
विपक्ष आपको यह सुनिश्चित करना होगा कि आपका कोड थ्रेड सुरक्षित है।
यदि कोई थ्रेड क्रैश का कारण बनता है, तो यह संभावित रूप से आपकी प्रक्रिया को नीचे ले जा सकता है।
जीआईएल I/O को छोड़कर सभी कार्यों को लॉक कर देता है।
<हेडर वर्ग ="ruby_magic" id ="ईवेंट-चालित">

इवेंट-लूप (पतला)

इवेंट-लूप का उपयोग तब किया जाता है जब आपको बहुत सारे समवर्ती I/O संचालन करने की आवश्यकता होती है। मॉडल स्वयं एक ही समय में कई अनुरोधों को निष्पादित करने के लिए बाध्य नहीं करता है, लेकिन यह कई समवर्ती उपयोगकर्ताओं को संभालने का एक प्रभावी तरीका है।

नीचे आपको रूबी में लिखा हुआ एक बहुत ही सरल ईवेंट लूप दिखाई देगा। लूप इवेंट को event_queue . से लेगा और इसे संभालो। यदि कोई ईवेंट नहीं है, तो यह सो जाएगा और यह देखने के लिए दोहराएगा कि क्या कतार में कोई नया ईवेंट है।

loop do
  if event_queue.any?
    handle_event(event_queue.pop)
  else
    sleep 0.1
  end
end

चित्रित संस्करण

इस उदाहरण में, हम इसे एक कदम आगे ले जा रहे हैं। इवेंट लूप अब OS, क्यू और कुछ मेमोरी के साथ एक सुंदर नृत्य करता है।

चरण दर चरण

  1. OS नेटवर्क और डिस्क की उपलब्धता पर नज़र रखता है।
  2. जब OS देखता है कि I/O तैयार है, तो वह कतार में एक ईवेंट भेजता है।
  3. कतार उन घटनाओं की सूची है जिनमें से इवेंट लूप सबसे ऊपर होता है।
  4. इवेंट लूप इवेंट को हैंडल करता है।
  5. यह कनेक्शन के बारे में मेटा डेटा संग्रहीत करने के लिए कुछ मेमोरी का उपयोग करता है।
  6. यह एक नया ईवेंट सीधे ईवेंट क्यू में फिर से भेज सकता है। उदाहरण के लिए, किसी ईवेंट की सामग्री के आधार पर कतार को बंद करने का संदेश।
  7. यदि वह एक I/O ऑपरेशन करना चाहता है, तो यह OS को बताता है कि वह एक विशिष्ट I/O ऑपरेशन में रुचि रखता है। OS नेटवर्क और डिस्क का ट्रैक रखता है (देखें [1]) और I/O तैयार होने पर फिर से एक ईवेंट जोड़ता है।
ईवेंट-लूप सारांश
यूज केस अपने उपयोगकर्ताओं के लिए बहुत सारे समवर्ती कनेक्शन का उपयोग करते समय। स्लैक जैसी सेवाओं के बारे में सोचें। क्रोम सूचनाएं।
पेशेवरों प्रति कनेक्शन लगभग कोई मेमोरी ओवरहेड नहीं।
बड़ी संख्या में समानांतर कनेक्शन के पैमाने।
विपक्ष इसे समझना एक कठिन मानसिक मॉडल है।
कतार बनने से बचने के लिए बैच का आकार छोटा और अनुमानित होना चाहिए।
<हेडर क्लास ="रूबी_मैजिक">

आपको किसका उपयोग करना चाहिए?

हमें उम्मीद है कि इस लेख ने आपको विभिन्न समवर्ती मॉडल की बेहतर समझ प्रदान की है। एक डेवलपर के रूप में इसे समझना कुछ अधिक कठिन विषय है, लेकिन इसे समझने से आपको प्रयोग करने और अपने ऐप के लिए सही सेटअप का उपयोग करने के लिए टूल मिल जाएंगे।

संक्षेप में

  • अधिकांश ऐप्स के लिए थ्रेडिंग समझ में आता है, ऐसा लगता है कि रूबी/रेल पारिस्थितिकी तंत्र इस तरह (धीरे-धीरे) आगे बढ़ रहा है।
  • यदि आप लंबे समय तक चलने वाली स्ट्रीम के साथ अत्यधिक समवर्ती ऐप्स चलाते हैं, तो ईवेंट-लूप आपको स्केल करने की अनुमति देता है।
  • यदि आपके पास उच्च ट्रैफ़िक साइट नहीं है, या आप उम्मीद करते हैं कि आपके कर्मचारी अच्छी पुरानी बहु-प्रक्रिया के लिए टूट जाएंगे।

और, एक थ्रेड के अंदर, एक बहु-प्रक्रिया सेटअप के अंदर एक ईवेंट लूप चलाना संभव है। तो हाँ, आप अपना स्ट्रूपवाफेल खा सकते हैं और इसे भी खा सकते हैं!

यदि आप इन समवर्ती मॉडलों के बारे में और अधिक पढ़ना चाहते हैं तो बहु-प्रक्रिया, बहु-थ्रेडिंग और ईवेंट लूप पर हमारे विस्तृत लेख देखें।


  1. डीबीएमएस में गतिरोध

    एक गतिरोध तब होता है जब दो या दो से अधिक प्रक्रियाओं को उनके निष्पादन को पूरा करने के लिए कुछ संसाधनों की आवश्यकता होती है जो दूसरी प्रक्रिया द्वारा आयोजित की जाती है। उपरोक्त आरेख में, प्रक्रिया 1 में संसाधन 1 है और संसाधन 2 की आवश्यकता है। इसी प्रकार प्रक्रिया 2 में संसाधन 2 है और संसाधन 1 की आव

  1. रूबी में यूनिक्स डेमॉन का सैद्धांतिक परिचय

    यूनिक्स डेमॉन ऐसे प्रोग्राम हैं जो बैकग्राउंड में चलते हैं। Nginx, Postgres और OpenSSH इसके कुछ उदाहरण हैं। वे अपनी प्रक्रियाओं को अलग करने के लिए कुछ विशेष तरकीबों का उपयोग करते हैं, और उन्हें किसी भी टर्मिनल से स्वतंत्र रूप से चलने देते हैं। मैं हमेशा डेमॉन से मोहित रहा हूं - शायद यह नाम है - और

  1. रूबी नियमित अभिव्यक्तियों को माहिर करना

    रूबी रेगुलर एक्सप्रेशन (रूबी रेगेक्स संक्षेप में) आपको आगे की प्रक्रिया के लिए डेटा निकालने के इरादे से स्ट्रिंग्स के अंदर विशिष्ट पैटर्न खोजने में मदद करता है। रेगुलर एक्सप्रेशन के लिए दो सामान्य उपयोग के मामलों में सत्यापन और पार्सिंग शामिल हैं। उदाहरण के लिए : रूबी रेगेक्स . के साथ ईमेल पते के