Erlang 21

global




erlang

global

मॉड्यूल

वैश्विक

मॉड्यूल सारांश

एक वैश्विक नाम पंजीकरण सुविधा।

विवरण

इस मॉड्यूल में निम्नलिखित सेवाएं शामिल हैं:

  • वैश्विक नामों का पंजीकरण
  • वैश्विक ताले
  • पूरी तरह से जुड़े नेटवर्क का रखरखाव

ये सेवाएँ global_name_server प्रक्रिया के माध्यम से नियंत्रित global_name_server जो हर नोड पर मौजूद होती हैं। नोड शुरू होने पर वैश्विक नाम सर्वर स्वचालित रूप से शुरू होता है। वैश्विक शब्द के साथ एक प्रणाली है, जिसमें कई एरलंग नोड्स होते हैं।

विश्व स्तर पर पंजीकृत नामों की क्षमता वितरित एर्लांग सिस्टम की प्रोग्रामिंग में एक केंद्रीय अवधारणा है। इस मॉड्यूल में, register/2 के बराबर register/2 और whois whereis/1 BIF (स्थानीय नाम पंजीकरण के लिए) प्रदान किए जाते हैं, लेकिन Erlang नोड्स के एक नेटवर्क के लिए। एक पंजीकृत नाम एक प्रक्रिया पहचानकर्ता (पीआईडी) के लिए एक उपनाम है। वैश्विक नाम सर्वर वैश्विक रूप से पंजीकृत ग्रिडों की निगरानी करता है। यदि कोई प्रक्रिया समाप्त हो जाती है, तो नाम विश्व स्तर पर अपंजीकृत भी है।

पंजीकृत नाम प्रत्येक नोड पर प्रतिकृति वैश्विक नाम तालिकाओं में संग्रहीत किए जाते हैं। कोई केंद्रीय भंडारण बिंदु नहीं है। इस प्रकार, एक पिड के लिए एक नाम का अनुवाद तेज है, क्योंकि यह हमेशा स्थानीय रूप से किया जाता है। वैश्विक नाम तालिका में परिवर्तन के परिणामस्वरूप किसी भी कार्रवाई के लिए, अन्य नोड्स पर सभी तालिकाएं स्वचालित रूप से अपडेट की जाती हैं।

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

पंजीकरण और लॉक दोनों सेवाएं परमाणु हैं। इन क्रियाओं में शामिल सभी नोड्स में सूचना का एक ही दृष्टिकोण है।

वैश्विक नाम सर्वर नोड कॉन्फ़िगरेशन में लगातार परिवर्तन की निगरानी का महत्वपूर्ण कार्य भी करता है। अगर एक नोड जो विश्व स्तर पर पंजीकृत प्रक्रिया चलाता है, तो नाम विश्व स्तर पर अपंजीकृत है। यह अंत करने के लिए, वैश्विक नाम सर्वर मॉड्यूल net_kernel से भेजे गए संदेश को nodeup और nodedown सदस्यता net_kernel । इस संदर्भ में प्रासंगिक कर्नेल अनुप्रयोग चर net_setuptime , net_ticktime और dist_auto_connect kernel(6) भी देखें।

नाम सर्वर भी पूरी तरह से जुड़े नेटवर्क को बनाए रखता है। उदाहरण के लिए, यदि नोड N1 नोड N2 (जो पहले से N3 से जुड़ा है) से जुड़ता है, तो नोड N1 और N3 पर वैश्विक नाम सर्वर यह सुनिश्चित करते हैं कि N1 और N3 भी जुड़े हुए हैं। यदि यह वांछित नहीं है, तो कमांड-लाइन फ्लैग -connect_all false का उपयोग किया जा सकता है (यह भी देखें erl(1) )। इस स्थिति में, नाम पंजीकरण सेवा का उपयोग नहीं किया जा सकता है, लेकिन लॉक तंत्र अभी भी काम करता है।

यदि वैश्विक नाम सर्वर नोड्स (उदाहरण में N1 और N3 ) को जोड़ने में विफल रहता है, तो एक चेतावनी घटना त्रुटि लकड़हारे को भेजी जाती है। इस तरह की घटना की उपस्थिति बाद में कनेक्ट करने के लिए नोड्स को बाहर नहीं करती है (उदाहरण के लिए, आप कमांड rpc:call(N1, net_adm, ping, [N2]) कोशिश कर सकते हैं rpc:call(N1, net_adm, ping, [N2]) शेल में), लेकिन यह नेटवर्क समस्या का संकेत देता है।

ध्यान दें

यदि पूरी तरह से कनेक्टेड नेटवर्क ठीक से सेट नहीं है, तो पहले net_setuptime का मान बढ़ाने का net_setuptime

जानकारी का प्रकार

id() = {ResourceId :: term(), LockRequesterId :: term()}

निर्यात

del_lock (Id) -> सच है
del_lock (Id, Nodes) -> सच

प्रकार

लॉक Id सिंक्रोनाइज़ करता है।

सूचना_का_नाम (नाम, Pid1, Pid2) -> कोई नहीं

प्रकार

re_register_name/3 और re_register_name/3 लिए एक नाम समाधान समारोह के रूप में इस्तेमाल किया जा सकता है।

फंक्शन दोनों को खोल देता है और दोनों प्रक्रियाओं को {global_name_conflict, Name, OtherPid} संदेश भेजता है।

random_exit_name (नाम, Pid1, Pid2) -> पिड ()

प्रकार

re_register_name/3 और re_register_name/3 लिए एक नाम समाधान समारोह के रूप में इस्तेमाल किया जा सकता है।

फ़ंक्शन बेतरतीब ढंग से पंजीकरण के लिए एक pids का चयन करता है और दूसरे को मारता है।

random_notify_name (नाम, Pid1, Pid2) -> pid ()

प्रकार

re_register_name/3 और re_register_name/3 लिए एक नाम समाधान समारोह के रूप में इस्तेमाल किया जा सकता है।

फ़ंक्शन बेतरतीब ढंग से पंजीकरण के लिए एक pids का चयन करता है, और दूसरे pid को संदेश {global_name_conflict, Name} भेजता है।

re_register_name (नाम, Pid) -> हाँ
re_register_name (नाम, पिड, रिज़ॉल्यूशन) -> हाँ

प्रकार

{ Module , Function } की भी अनुमति है।

Pid को संदर्भित करने के लिए सभी नोड्स पर पंजीकृत नाम को एटोमिक रूप से बदलता है।

फ़ंक्शन Resolve में register_name/2,3 के समान व्यवहार है।

register_name (नाम, पिड) -> हाँ | नहीं
register_name (नाम, पिड, रिज़ॉल्यूशन) -> हाँ | नहीं

प्रकार

{ Module , Function } भी पिछड़े संगतता के लिए अनुमति दी है, लेकिन इसका उपयोग पदावनत है।

विश्व स्तर पर नाम का Name एक पिड के साथ जोड़ा जाता है, जो कि विश्व स्तर पर एर्लांग नोड्स के एक नेटवर्क में एक नए वैश्विक नाम के सभी नोड्स को सूचित करता है।

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

चेतावनी

यदि आप अपने सिस्टम को फिर से शुरू किए बिना कोड बदलने की योजना बनाते हैं, तो आपको fun Module:Function/Arity रूप में एक बाहरी मज़ा ( fun Module:Function/Arity ) का उपयोग करना होगा। यदि आप एक स्थानीय मज़े का उपयोग करते हैं, तो आप उस मॉड्यूल के लिए कोड को कभी भी प्रतिस्थापित नहीं कर सकते हैं जो मज़ेदार है।

तीन पूर्वनिर्धारित संकल्प फ़ंक्शन मौजूद हैं: random_exit_name/3 , random_notify_name/3 , और notify_all_name/3 । यदि कोई random_exit_name फ़ंक्शन परिभाषित नहीं है, तो random_exit_name का उपयोग किया जाता है। इसका मतलब यह है कि दो पंजीकृत प्रक्रियाओं में से एक को सही माना जाता है जबकि दूसरे को मार दिया जाता है।

यह फ़ंक्शन पूरी तरह से सिंक्रोनस है, अर्थात, जब यह फ़ंक्शन वापस आता है, तो नाम या तो सभी नोड्स पर पंजीकृत होता है या कोई भी नहीं।

फ़ंक्शन सफल होने पर yes लौटाता है, यदि वह विफल रहता है। उदाहरण के लिए, यदि कोई पहले से पंजीकृत प्रक्रिया को पंजीकृत करने या पहले से उपयोग में आने वाले नाम के साथ प्रक्रिया को पंजीकृत करने का प्रयास किया जाता है, तो no लौटाया no जाता है।

ध्यान दें

Erlang / OTP R10 तक और सहित की जाँच इस बात की जाँच नहीं करती कि क्या प्रक्रिया पहले से पंजीकृत थी। वैश्विक नाम तालिका इसलिए असंगत हो सकती है। पुराने (छोटी गाड़ी) व्यवहार को कर्नेल एप्लिकेशन वैरिएबल global_multi_name_action मान की allow देकर चुना जा सकता है।

यदि एक पंजीकृत नाम के साथ एक प्रक्रिया मर जाती है, या नोड नीचे चला जाता है, तो नाम सभी नोड्स पर अपंजीकृत है।

पंजीकृत_नाम () -> [नाम]

प्रकार

वैश्विक रूप से पंजीकृत सभी नामों की सूची लौटाता है।

भेजें (नाम, Msg) -> पिड

प्रकार

Msg को Name रूप में वैश्विक रूप से पंजीकृत पीआईडी ​​पर भेजता है।

यदि Name विश्व स्तर पर पंजीकृत नाम नहीं है, तो कॉलिंग फ़ंक्शन कारण {badarg, {Name, Msg}} बाहर निकल जाता है।

set_lock (Id) -> बूलियन ()
set_lock (आईडी, नोड्स) -> बूलियन ()
set_lock (आईडी, नोड्स, रिट्रीट) -> बूलियन ()

प्रकार

LockRequesterId लिए ResourceId पर निर्दिष्ट नोड्स (या सभी नोड्स पर यदि कोई भी निर्दिष्ट नहीं है) पर एक लॉक सेट करता है। यदि LockRequesterId तुलना में किसी अन्य आवश्यक के लिए पहले से ही ResourceId LockRequesterId पर एक ताला मौजूद है, और Retries 0 बराबर नहीं है, तो प्रक्रिया थोड़ी देर के लिए सोती है और बाद में कार्रवाई को निष्पादित करने की कोशिश करती है। जब Retries प्रयास करने का प्रयास किया गया है, तो false वापसी की जाती है, अन्यथा true । यदि Retries infinity , तो अंत में true लौटाया जाता है (जब तक कि लॉक को कभी जारी नहीं किया जाता)।

यदि Retries लिए कोई मूल्य निर्दिष्ट नहीं है, तो infinity का उपयोग किया जाता है।

यह फ़ंक्शन पूरी तरह से सिंक्रोनस है।

यदि एक प्रक्रिया जो लॉक रखती है, या नोड नीचे जाती है, तो प्रक्रिया द्वारा आयोजित ताले हटा दिए जाते हैं।

वैश्विक नाम सर्वर एक ही लॉक को साझा करने वाली सभी प्रक्रियाओं का ट्रैक रखता है, यानी यदि दो प्रक्रियाएं एक ही लॉक सेट करती हैं, तो दोनों प्रक्रियाओं को लॉक को हटाना होगा।

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

ध्यान दें

ResourceId के निम्नलिखित मूल्यों से बचें, अन्यथा Erlang / OTP ठीक से काम नहीं करता है:

  • dist_ac
  • global
  • mnesia_adjust_log_writes
  • mnesia_table_lock
  • pg2
सिंक () -> ठीक है | {त्रुटि, कारण :: शब्द ()}

इस नोड के लिए ज्ञात सभी नोड्स के साथ वैश्विक नाम सर्वर को सिंक्रनाइज़ करता है। ये वे नोड्स हैं जो erlang:nodes() से लौटे हैं erlang:nodes() । जब यह फ़ंक्शन वापस आता है, तो वैश्विक नाम सर्वर सभी नोड्स से वैश्विक जानकारी प्राप्त करता है। यह फ़ंक्शन तब कहा जा सकता है जब नेटवर्क में नए नोड जोड़े जाते हैं।

एकमात्र संभावित त्रुटि कारण Reason {"global_groups definition error", Error}

ट्रांस (आईडी, मज़ा) -> Res | निरस्त किया गया
ट्रांस (आईडी, मज़ा, नोड्स) -> Res | निरस्त किया गया
ट्रांस (आईडी, फन, नोड्स, रिट्रीट) -> Res | निरस्त किया गया

प्रकार

Id पर एक सेट सेट करता है ( set_lock/3 का उपयोग करके)। यदि यह सफल होता है, तो Fun() का मूल्यांकन किया जाता है और परिणाम Res लौटाया जाता है। यदि लॉक का प्रयास विफल हो जाता है तो रिटर्न aborted हो जाता है। यदि Retries infinity लिए सेट है, तो लेनदेन समाप्त नहीं होता है।

infinity डिफ़ॉल्ट सेटिंग है और इसका उपयोग तब किया जाता है जब कोई मूल्य Retries लिए निर्दिष्ट नहीं किया जाता है।

unregister_name (नाम) -> शब्द ()

प्रकार

Erlang नोड्स के नेटवर्क से वैश्विक रूप से पंजीकृत नाम का Name हटाता है।

whereis_name (नाम) -> pid () | अपरिभाषित

प्रकार

विश्व स्तर पर पंजीकृत नाम के साथ पीआईडी ​​लौटाता है। यदि नाम विश्व स्तर पर पंजीकृत नहीं है तो undefined है।

यह भी देखें

global_group(3) , net_kernel(3)