सबसे पहले, मैं एरलांग सीखने के संबंध में सिर्फ मेरे सही सुझाव के जवाब से सहमत हूं। यह एक ज्यादातर कार्यात्मक भाषा है (हालांकि संगामिति एक बड़ी भूमिका निभाती है), और इसकी सभी विशेषताओं को दोष-सहिष्णुता और मजबूती की ओर जाने के लिए जोड़ा गया था, जो कि पहले स्थान पर जावास्क्रिप्ट के समान डिज़ाइन लक्ष्य नहीं है।
सभी में से दूसरा, नेल.जेएस को एर्लांग में जाने के लिए छोड़ना थोड़ा गलत है। Node.js एक एकल सर्वर / ढांचा है जो कॉलबैक की मदद से सब कुछ घटना-संचालित तरीके से करने के लिए जाता है। एर्लैंग का अपना ढांचा (ओटीपी) है, लेकिन यह समान स्तर पर नहीं है।
यदि आप एरलांग सीखने की योजना बनाते हैं, तो मैं ट्यूटोरियल में गोता लगाने से पहले इंट्रो रीडिंग के रूप में मेरे ब्लॉग प्रविष्टि एरलंग बिगिनर (या ऑन्जेंडर) के लिए एक ओपन लेटर सुझाता हूं ।
केवल एक चीज आप पैटर्न और उपयोग के संदर्भ में एर्लैंग और नोड.जेएस की तुलना कर सकते हैं कि वे घटना-चालित कैसे हैं। हालांकि, यहां दो बड़े अंतर हैं। Node.js का मॉडल घटनाओं के लिए बाध्य कॉलबैक पर आधारित है। एरलंग संदेश कतारों और चयनात्मक प्राप्तियों पर आधारित है। वहाँ निहितार्थ क्या हैं?
सबसे पहले, यदि आप कॉलबैक-आधारित तरीके से काम करते हैं, तो जिस तरह से आप राज्य के चारों ओर ले जाते हैं, वह या तो वैश्विक है या निरंतरता-गुजर शैली प्रोग्रामिंग में मिलता है। दूसरे, आपको स्वयं पूर्ण इवेंट मैट्रिक्स की देखभाल करनी होगी। इसका एक उदाहरण यह है कि अगर हम एक बहुत ही सरल परिमित अवस्था मशीन की कल्पना करते हैं: एक म्यूटेक्स सेमाफोर, घटना-चालित।
म्यूटेक्स सेमाफोर के दो राज्य हैं: लॉक और फ्री। जब भी गणना की एक इकाई (कार्यकर्ता, प्रक्रिया, कार्य या धागा) म्यूटेक्स तक पहुंच प्राप्त करना चाहता है, तो उसे एक ऐसी घटना को आग देना होगा जो यह बताता है कि 'मैं दिलचस्पी रखता हूं'। अब आपको निम्नलिखित प्रकार के आयोजनों की देखभाल करनी होगी:
- म्यूटेक्स मुक्त है और आप लॉक प्राप्त करने के लिए कहते हैं
- म्यूटेक्स किसी और द्वारा लॉक किया गया है और आप लॉक प्राप्त करना चाहते हैं
- म्यूटेक्स अपने आप से बंद है और आप म्यूटेक्स को मुक्त करना चाहते हैं
फिर आपके पास विचार करने के लिए अतिरिक्त कार्यक्रम हैं, जैसे कि गतिरोध से बचने के लिए समय समाप्त करना:
- म्यूटेक्स को बंद कर दिया गया है और आप बहुत देर तक इंतजार करते रहे, आग बुझाने के लिए टाइमर
- म्यूटेक्स को लॉक कर दिया गया है और आपने बहुत देर तक इंतजार किया, लॉक प्राप्त किया, फिर टाइमआउट बंद हो गया
तो फिर तुम भी बाध्य घटनाओं से बाहर है:
- आपने अभी म्यूटेक्स को लॉक किया है जबकि कुछ कार्यकर्ता ने इसे मुफ्त होने की उम्मीद की थी। अब उस कार्यकर्ता की क्वेरी को कतारबद्ध करना होगा ताकि जब वह मुक्त हो जाए तो उसे वापस संभाला जा सके
- आपको काम के सभी को अतुल्यकालिक बनाने की आवश्यकता है
इवेंट मैट्रिक्स बहुत तेजी से जटिल हो जाता है। हमारे यहां एफएसएम केवल 2 राज्य हैं। एरलैंग (या किसी भी भाषा में चयनात्मक प्राप्ति और संभावित तुल्यकालिक घटनाओं के साथ एसिंक्स) के मामले में, आपको कुछ मामलों की देखभाल करनी होगी:
- म्यूटेक्स मुक्त है और आप लॉक प्राप्त करने के लिए कहते हैं
- म्यूटेक्स किसी और द्वारा लॉक किया गया है और आप लॉक प्राप्त करना चाहते हैं
- म्यूटेक्स अपने आप से बंद है और आप म्यूटेक्स को मुक्त करना चाहते हैं
और बस। टाइमर को प्राप्त होने के साथ ही मामलों को नियंत्रित किया जाता है, और किसी भी चीज़ के लिए जिसे 'प्रतीक्षा करने तक यह मुफ़्त है' के साथ करना पड़ता है, संदेश स्वचालित रूप से कतारबद्ध हो जाते हैं: कार्यकर्ता को केवल एक उत्तर की प्रतीक्षा करनी होती है। मॉडल इन मामलों में बहुत सरल है।
इसका मतलब यह है कि सामान्य मामलों में, CPS और कॉलबैक-आधारित मॉडल जैसे कि node.js में या तो आप बहुत चालाक होने के लिए पूछते हैं कि आप घटनाओं को कैसे संभालते हैं, या आपको पूरे जटिल इवेंट मैट्रिक्स का पूरा ध्यान रखने के लिए कहते हैं, क्योंकि आपको प्रत्येक असंगत मामले पर वापस बुलाया जाना चाहिए जो अजीब समय के मुद्दों और राज्य परिवर्तनों से उत्पन्न होता है।
चयनात्मक प्राप्तियां आमतौर पर आपको सभी संभावित घटनाओं के एक उपसमूह में ध्यान केंद्रित करने की अनुमति देती हैं और आपको उस मामले में घटनाओं के बारे में अधिक आसानी से तर्क करने की अनुमति देती हैं। ध्यान दें कि एर्लैंग में किसी चीज़ का व्यवहार (डिज़ाइन पैटर्न / फ्रेमवर्क कार्यान्वयन) होता है gen_event
। Gen_event कार्यान्वयन आपको एक तंत्र के समान होने की अनुमति देता है जो नोड में उपयोग किया जा रहा है। यदि ऐसा है जो आप चाहते हैं।
ऐसे अन्य बिंदु होंगे जो उन्हें अलग करते हैं; Erlang का प्रीमेप्टिव शेड्यूलिंग है जबकि नोड.जेएस इसे सहयोगी बनाता है, Erlang कुछ बहुत बड़े पैमाने पर एप्लिकेशन (वितरण और सभी) के लिए उपयुक्त है, लेकिन Node.js और इसका समुदाय आमतौर पर अधिक वेब-एप और नवीनतम वेब प्रवृत्ति के बारे में जानकार है। यह सबसे अच्छा उपकरण चुनने का सवाल है, और यह आपकी पृष्ठभूमि, आपकी समस्या का प्रकार, और आपकी प्राथमिकताओं पर निर्भर करेगा। मेरे मामले में, एरलांग का मॉडल मेरे सोचने के तरीके को बहुत अच्छी तरह से फिट करता है। जरूरी नहीं कि हर किसी के लिए यही हो।
उम्मीद है की यह मदद करेगा।