supervisor:start_child/2
नोड्स भर में इस्तेमाल किया जा सकता।
आपके भ्रम का कारण केवल निष्पादन के संदर्भ के बारे में एक मिश्रण है (जिसे कभी-कभी सीधे रखने के लिए थोड़ा मुश्किल होता है)। वहाँ तीन प्रक्रियाओं किसी भी OTP अंडे में शामिल हैं:
- अनुरोधक
- पर्यवेक्षक
- पैदा की प्रक्रिया
अनुरोधक के संदर्भ जिसमें supervisor:start_child/2
कहा जाता है - नहीं पर्यवेक्षक के संदर्भ।
do_some_crashable_work(Data) ->
supervisor:start_child(sooper_dooper_sup, [Data]).
परिभाषित किया जा सकता है कि और पर्यवेक्षक मॉड्यूल से निर्यात किया, के अनुसार प्रक्रिया का एक "प्रबंधक" प्रकार में आंतरिक रूप में परिभाषित किया जा: आप सामान्य रूप से एक समारोह है कि supervisor:spawn_child/2
करने के लिए कॉल लपेटता निर्यात करके एक पर्यवेक्षक इंटरफ़ेस प्रदान करेगा "service manager/supervisor/workers" idiom, या जो भी हो। सभी मामलों में, हालांकि, पर्यवेक्षक के अलावा कुछ प्रक्रिया इस कॉल को कर रही है।
अब (कभी कभी erlang.org किसी कारण के लिए एक कठिन समय है के बाद से here, और an R19.1 doc mirror) फिर supervisor:start_child/2
के लिए Erlang डॉक्स पर ध्यान से देखो। ध्यान दें कि प्रकार sup_ref()
एक पंजीकृत नाम, pid()
, {global, Name}
या {Name, Node}
हो सकता है। अनुरोधकर्ता किसी भी किसी भी अन्य नोड पर एक पर्यवेक्षक बुला जब एक pid()
, {global, Name}
या एक {Name, Node}
टपल साथ बुला नोड पर हो सकता है।
पर्यवेक्षक सिर्फ बेतरतीब ढंग से चीजों को शुरू नहीं करता है, हालांकि। इसमें child_spec()
है, यह जा रहा है, और स्पेस पर्यवेक्षक को बताता है कि उस नई प्रक्रिया को शुरू करने के लिए क्या कॉल करना है। पर्यवेक्षक के संदर्भ में बाल मॉड्यूल में यह पहला कॉल बनाया गया है और यह एक कस्टम फ़ंक्शन है। हालांकि हम आम तौर पर इसे start_link/N
जैसे कुछ नाम देते हैं, यह स्टार्टअप के हिस्से के रूप में जो भी हम चाहते हैं, कर सकते हैं, जिसमें एक विशिष्ट नोड घोषित करना शामिल है जिसमें स्पॉन करना है।
%% Usually defined in the requestor or supervisor module
do_some_crashable_work(SupNode, WorkerNode, Data) ->
supervisor:start_child({sooper_dooper_sup, SupNode}, [WorkerNode, Data]).
की तरह कुछ का एक बच्चा कल्पना के साथ: तो अब हम कुछ इस तरह से हवा
%% Usually in the supervisor code
SooperWorker = {sooper_worker,
{sooper_worker, start_link, []},
temporary,
brutal_kill,
worker,
[sooper_worker]},
इंगित करता है कौन सा है कि पहली कॉल sooper_worker:start_link/2
होगा:
%% The exported start_link function in the worker module
%% Called in the context of the supervisor
start_link(Node, Data) ->
Pid = proc_lib:spawn_link(Node, ?MODULE, init, [self(), Data]).
%% The first thing the newly spawned process will execute
%% in its own context, assuming here it is going to be a gen_server.
init(Parent, Data) ->
Debug = sys:debug_options([]),
{ok, State} = initialize_some_state(Data)
gen_server:enter_loop(Parent, Debug, State).
आप सोच रहे होंगे कि proc_lib
के साथ जो कुछ भी मिल रहा है उसके लिए क्या था।यह पता चला है कि बहु-नोड सिस्टम के भीतर कहीं भी एक स्पॉन शुरू करने के लिए एक बहु-नोड सिस्टम के भीतर कहीं भी एक स्पॉन शुरू करने के लिए संभव है, यह व्यवसाय करने का एक बहुत ही उपयोगी तरीका नहीं है, और इसलिए gen_*
व्यवहार और यहां तक कि proc_lib:start_link/N
में नोड को घोषित करने की कोई विधि नहीं है जिस पर नई प्रक्रिया को जन्म दिया जाए।
जो आप आदर्श रूप से चाहते हैं वह नोड्स है जो जानता है कि खुद को कैसे प्रारंभ करें और क्लस्टर में शामिल होने के बाद कैसे शामिल हों। आपके सिस्टम द्वारा प्रदान की जाने वाली जो भी सेवाएं क्लस्टर के भीतर अन्य नोड्स पर आमतौर पर सबसे अच्छी तरह से दोहराई जाती हैं, और फिर आपको केवल नोड चुनने का एक तरीका लिखना पड़ता है, जो आपको स्टार्टअप के व्यवसाय को पूरी तरह से बाहर करने की अनुमति देता है क्योंकि यह अब नोड-लोकल में है हर मामले इस मामले में जो भी आपके साधारण प्रबंधक/पर्यवेक्षक/कार्यकर्ता कोड को बदलने की ज़रूरत नहीं है - सामान बस होता है, और इससे कोई फर्क नहीं पड़ता कि अनुरोधकर्ता का पीआईडी किसी अन्य नोड पर होता है, भले ही वह पीआईडी पता हो जो परिणाम लौटाया जाना चाहिए।
एक और तरीका कहा, हम नहीं है वास्तव में मनमाने ढंग से नोड्स पर कार्यकर्ताओं अंडे देने के लिए चाहते हैं, तो क्या हम वास्तव में क्या करना चाहते हैं एक उच्च स्तर और अनुरोध है कि कुछ काम एक और नोड द्वारा कर पाने और वास्तव में परवाह नहीं करने के लिए कदम है इसके बारे में कैसे होता है। याद रखें, {M,F,A}
पर आधारित किसी विशेष फ़ंक्शन को जन्म देने के लिए जिस कॉल को आप कॉल कर रहे हैं उसे कॉल करने के लिए लक्ष्य मॉड्यूल और फ़ंक्शन तक पहुंच होनी चाहिए - अगर उसके पास पहले से कोड की एक प्रति है, तो यह कॉलिंग नोड का डुप्लिकेट क्यों नहीं है?
उम्मीद है कि यह उत्तर उलझन में उससे अधिक समझाया गया है।
मुझे लगता है कि अनुशंसित तरीका प्रत्येक नोड पर पर्यवेक्षक होना है। – Dogbert
@ डोगबर्ट वास्तव में। असल में, न सिर्फ एक पर्यवेक्षक, बल्कि आमतौर पर जो भी सिस्टम वितरित किया जा रहा है उसकी एक पूर्ण प्रतिलिपि ताकि काम अनुरोध कोड में नाटकीय परिवर्तन किए बिना क्रॉस-नोड हो सके। – zxq9