GenServer.start_link/3
में मैं एक नाम पंजीकृत कर सकते स्थानीय स्तर पर इस तरह की एक प्रक्रिया के लिए एक परमाणु का उपयोग कर:GenServer.start_link/3 में {: through, module, term} का उपयोग करके नाम पंजीकरण करने का क्या फायदा है?
defmodule Worker do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, nil, name: :worker)
end
end
तो मैं एक पर्यवेक्षक शुरू कर सकते हैं इस प्रक्रिया की निगरानी के लिए:
defmodule Boss do
use Supervisor
def init(_) do
children = [worker(Worker, [])]
supervise(children, strategy: :one_for_one)
end
end
अब मैं बनाना चाहते पर्यवेक्षक 3 Worker
प्रक्रियाओं की निगरानी के लिए, इसलिए मुझे उन 3 प्रक्रियाओं को अद्वितीय नाम देने की आवश्यकता है, ताकि पर्यवेक्षक प्रक्रिया को पुनरारंभ कर सकें, यह हमेशा एक ही प्रतीकात्मक नाम का उपयोग करेगा।
मैं बस इस तरह अद्वितीय Worker
प्रक्रिया नाम के लिए स्ट्रिंग प्रक्षेप का उपयोग कर सकते हैं:
defmodule Worker do
use GenServer
def start_link(id) do
GenServer.start_link(__MODULE__, nil, name: :"worker_#{id}")
end
end
तो इस तरह 3 प्रक्रियाओं की निगरानी:
defmodule Boss do
use Supervisor
def init(_) do
children = for id <- 1..3 do
worker(Worker, [id], id: id)
end
supervise(children, strategy: :one_for_one)
end
end
ऐसा लगता है कि उम्मीद से काम करता है।
Name Registration section के तहत जेनसेवर के लिए दस्तावेज़ में, यह कहता है कि आप नाम भी पंजीकृत करने के लिए {:via, module, term}
का उपयोग कर सकते हैं।
{: के माध्यम से, मॉड्यूल, टर्म} - जेनसेवर तंत्र और नाम के साथ पंजीकृत है। : विकल्प के माध्यम से एक मॉड्यूल की अपेक्षा करता है जो register_name/2, unregister_name/1, whereis_name/1 और भेज/2 निर्यात करता है। एक ऐसा उदाहरण है: ग्लोबल मॉड्यूल जो के लिए इन कार्यों का उपयोग करता है प्रक्रियाओं के नामों और उनके संबंधित पिड की सूची रखते हुए एरलांग नोड्स के नेटवर्क के लिए विश्व स्तर पर उपलब्ध हैं।
हालांकि, ताकि :via
विकल्प का उपयोग करने में आप एक मॉड्यूल register_name/2
, unregister_name/1
, whereis_name/1
और send/2
निर्यात करता है, जो केवल के रूप में ऊपर दिखाए गए स्ट्रिंग प्रक्षेप तकनीक का उपयोग करने के लिए की तुलना में बहुत बोझिल लगता है लागू करने के लिए की है।
तो मेरे सवाल है:
- क्या है का उपयोग कर नाम दर्ज करने के लाभ: बस स्ट्रिंग प्रक्षेप का उपयोग करने पर {के माध्यम से, मॉड्यूल, अवधि}?
- क्या नाम पंजीकरण करने के लिए
:via
विकल्प का उपयोग करने का कोई व्यावहारिक उदाहरण है?