Erlang 21 - 12. Processes

12 प्रक्रियाएँ




erlang

12 प्रक्रियाएँ

12.1 प्रक्रियाएं

Erlang बड़े पैमाने पर संगामिति के लिए डिज़ाइन किया गया है। एरलैंग प्रक्रियाएं छोटी मेमोरी फुटप्रिंट के साथ हल्की होती हैं (गतिशील रूप से सिकुड़ती हैं), तेजी से बनाने और समाप्त करने के लिए, और शेड्यूलिंग ओवरहेड कम है।

12.2 प्रक्रिया निर्माण

spawn कहकर एक प्रक्रिया बनाई जाती है:

spawn(Module, Name, Args) -> pid()
  Module = Name = atom()
  Args = [Arg1,...,ArgN]
    ArgI = term()

spawn एक नई प्रक्रिया बनाता है और पीआईडी ​​लौटाता है।

नई प्रक्रिया Module:Name(Arg1,...,ArgN) में शुरू होती है Module:Name(Arg1,...,ArgN) जहां तर्क (संभव खाली) Args तर्क सूची के तत्व हैं।

कई अन्य spawn बीआईएफ मौजूद हैं, उदाहरण के लिए, दूसरे नोड पर एक प्रक्रिया को स्पॉन करने के लिए स्पॉन spawn/4

12.3 पंजीकृत प्रक्रियाएं

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

BIF विवरण
register(Name, Pid) प्रक्रिया Name , Name , एक परमाणु को संबद्ध करता है।
registered() register/2 का उपयोग करके register/2 नामों की सूची लौटाता है।
whereis(Name) Name तहत पंजीकृत पीआईडी ​​लौटाता है, या नाम पंजीकृत नहीं होने पर undefined

तालिका 12.1: नाम पंजीकरण BIF

12.4 प्रक्रिया समाप्ति

जब कोई प्रक्रिया समाप्त होती है, तो यह हमेशा एक निकास कारण के साथ समाप्त हो जाती है। इसका कारण कोई भी शब्द हो सकता है।

एक प्रक्रिया को सामान्य रूप से समाप्त करने के लिए कहा जाता है, अगर बाहर निकलने का कारण परमाणु normal । अमल करने के लिए कोई और अधिक कोड वाली प्रक्रिया सामान्य रूप से समाप्त हो जाती है।

जब रन-टाइम त्रुटि होती है {Reason,Stack} एक प्रक्रिया एक एक्जिट कारण {Reason,Stack} साथ समाप्त हो जाती है। Exit Reasons देखें।

एक प्रक्रिया निम्नलिखित बीआईएफ में से एक को कॉल करके खुद को समाप्त कर सकती है:

  • exit(Reason)
  • erlang:error(Reason)
  • erlang:error(Reason, Args)

इसके बाद यह प्रक्रिया अन्य लोगों के लिए कारण Reason से exit/1 या {Reason,Stack}

एक प्रक्रिया को भी समाप्त किया जा सकता है यदि इसे normal से एक अन्य निकास कारण के साथ एक निकास संकेत प्राप्त normal , Error Handling देखें।

12.5 संदेश भेजना

संदेश भेजने और प्राप्त करने के लिए प्रक्रियाएं संवाद करती हैं। संदेश send operator ! का उपयोग करके भेजे जाते हैं send operator ! और कॉलिंग receive करके receive

संदेश भेजना अतुल्यकालिक और सुरक्षित है, संदेश अंततः प्राप्तकर्ता तक पहुंचने की गारंटी है, बशर्ते कि प्राप्तकर्ता मौजूद हो।

12.6 लिंक

दो प्रक्रियाओं को एक दूसरे से जोड़ा जा सकता है। दो प्रक्रियाओं Pid1 और Pid2 बीच एक लिंक Pid1 द्वारा BIF link(Pid2) (या वार्तालाप) को कॉल करके बनाया गया है। इसमें कई spawn_link बीआईएफ भी मौजूद हैं, जो स्पॉन और एक ऑपरेशन में एक प्रक्रिया से spawn_link

लिंक द्विदिश हैं और दो प्रक्रियाओं के बीच केवल एक लिंक हो सकता है। link(Pid) पर बार-बार कॉल का कोई असर नहीं होता।

BIF unlink(Pid) कॉल करके एक लिंक को हटाया जा सकता है।

लिंक का उपयोग अन्य प्रक्रियाओं के व्यवहार की निगरानी के लिए किया जाता है, Error Handling देखें।

12.7 त्रुटि से निपटने

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

ओटीपी पर्यवेक्षण पेड़ों के बारे में अधिक जानकारी के लिए OTP Design Principles देखें, जो इस सुविधा का उपयोग करते हैं।

उत्सर्जन संकेतों से बाहर निकलना

जब कोई प्रक्रिया समाप्त हो जाती है, तो यह प्रक्रिया समाप्ति के रूप में समझाया गया एक निकास कारण के साथ Process Termination । यह निकास कारण सभी लिंक की गई प्रक्रियाओं के लिए एक निकास संकेत में उत्सर्जित होता है।

एक प्रक्रिया भी फ़ंक्शन exit(Pid,Reason) कॉल कर सकती है। इसका कारण एग्जिट सिग्नल में एग्जिट का Reason होता है, इसका Reason Pid उत्सर्जित होना है, लेकिन यह कॉलिंग प्रक्रिया को प्रभावित नहीं करता है।

एक्जिट सिग्नल प्राप्त करना

डिफ़ॉल्ट प्रक्रिया जब एक प्रक्रिया normal से बाहर निकलने के कारण के साथ एक निकास संकेत प्राप्त करती है, तो समाप्त हो जाती है और बदले में बाहर निकलने के संकेतों को अपनी लिंक की गई प्रक्रियाओं के समान निकास के साथ छोड़ देती है। normal कारण के साथ एक निकास संकेत की अनदेखी की जाती है।

कॉल करके एग्जिट सिग्नल को फंसाने के लिए एक प्रक्रिया निर्धारित की जा सकती है:

process_flag(trap_exit, true)

जब कोई प्रक्रिया बाहर निकल रही है, तो निकास संकेत मिलने पर यह समाप्त नहीं होता है। इसके बजाय, सिग्नल एक संदेश {'EXIT',FromPid,Reason} में तब्दील हो जाता है, जिसे नियमित संदेश की तरह ही प्रक्रिया के मेलबॉक्स में डाल दिया जाता है।

उपरोक्त का एक अपवाद यह है कि यदि निकास का कारण kill , तो यह है कि exit(Pid,kill) को कहा जाता है। यह बिना शर्त प्रक्रिया को समाप्त कर देता है, भले ही वह निकास संकेतों को फंसा रहा हो।

12.8 मॉनिटर

लिंक का एक विकल्प मॉनिटर है । एक प्रक्रिया Pid1 , BIF erlang:monitor(process, Pid2) को कॉल करके Pid2 लिए एक मॉनिटर बना सकती है। फ़ंक्शन संदर्भ Ref देता है।

यदि Pid2 बाहर निकलने के कारण के साथ समाप्त होता है, तो एक 'DOWN' संदेश Pid1 भेजा जाता है:

{'DOWN', Ref, process, Pid2, Reason}

यदि Pid2 मौजूद नहीं है, तो 'DOWN' संदेश तुरंत Reason सेट के साथ भेजा जाता है।

मॉनिटर यूनिडायरेक्शनल हैं। इरलंग को बार-बार कॉल करना erlang:monitor(process, Pid) कई स्वतंत्र मॉनिटर बनाता है, और प्रत्येक जब Pid समाप्त हो जाता है, तो एक 'डाउन' संदेश भेजता है।

erlang:demonitor(Ref) को कॉल करके एक मॉनिटर को हटाया जा सकता है।

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

12.9 प्रक्रिया शब्दकोश

प्रत्येक प्रक्रिया का अपना प्रक्रिया शब्दकोश होता है, जिसे निम्नलिखित BIF को कॉल करके एक्सेस किया जाता है:

put(Key, Value)
get(Key)
get()
get_keys(Value)
erase(Key)
erase()