यह निर्भर करता है।आप केवल प्रति नोड एक GenServer
प्रक्रिया शुरू करते हैं तो आप इसे पसंद कॉल कर सकते हैं:
@doc """
If you want to call the server only from the current module.
"""
def local_call(message) do
GenServer.call(__MODULE__, message)
end
या
@doc """
If you want to call the server from another node on the network.
"""
def remote_call(message, server \\ nil) do
server = if server == nil, do: node(), else: server
GenServer.call({__MODULE__, server}, message)
end
आप एक ही मॉड्यूल से कई प्रक्रियाओं है, तो आप एक अतिरिक्त पहचानकर्ता की जरूरत है (उदाहरण के लिए, यदि मांग पर GenServer
एस उत्पन्न करने के लिए आपके पास पर्यवेक्षक रणनीति :simple_one_for_one
है)। नाम प्रक्रियाओं के लिए
:gproc
शानदार है और यह GenServer
के साथ काम करता है। आप आमतौर पर एक पंजीकृत नाम के रूप में एक परमाणु का उपयोग कर अपनी प्रक्रियाओं का नाम देते हैं। :gproc
आपको अपनी प्रक्रियाओं को मनमाने ढंग से शब्द यानी एक टुपल के साथ नामित करने की अनुमति देता है।
मान लें कि मेरे फ़ंक्शन कॉल में मेरे पास {:id, id :: term}
जैसे मेरे सर्वर का जटिल पहचानकर्ता है, उदाहरण के लिए id
स्ट्रिंग हो सकता है। मैं शुरू मेरे GenServer
की तरह कर सकते हैं:
defmodule MyServer do
use GenServer
def start_link(id) do
name = {:n, :l, {:id, id}}
GenServer.start_link(__MODULE__, %{}, name: {:via, :gproc, name})
end
(...)
end
और ऊपर, जैसे कि मैंने पहले कहा, उदाहरण के लिए एक स्ट्रिंग एक परमाणु की तुलना में कुछ अलग से मेरी प्रक्रिया देखो,। तो अगर मैं की तरह अपने सर्वर शुरू:
MyServer.start_link("My Random Hash")
और मैं की तरह एक समारोह है: यदि आपका नामकरण प्रक्रिया है
MyServer.f("My Random Hash", {:message, "Hello"})
:
def f(id, message) do
improved_call(id, message)
end
defp improved_call(id, message, timeout \\ 5000) do
name = {:n, :l, {:id, id}}
case :gproc.where(name) do
undefined -> :error
pid -> GenServer.call(pid, message, timeout)
end
आप की तरह प्रक्रियाओं कॉल करने के लिए उपयोग कर सकते हैं अधिक जटिल, आप अधिक जटिल स्थिति को स्टोर करने के लिए :ets
का उपयोग कर सकते हैं।
आप उपयोग करना चाहते हैं :gproc
आप इसे अपने mix.exs
फ़ाइल की तरह करने के लिए जोड़ सकते हैं:
(...)
defp deps do
[{:gproc, github: "uwiger/gproc"}]
end
(...)
एक तरफ ध्यान दें पर, कभी नहीं, कभी handle_call/3
के भीतर से GenServer.call/3
कहते हैं। यह समय-समय पर होगा और आपके अन्य GenServer.call
एस पर एक डॉस करेगा। handle_call/3
उस समय एक संदेश संभालता है।
ऑनोरियो की तरह, आप GenServer.call (स्वयं, अनुरोध) का उपयोग कर सकते हैं। इसमें देखें: http://elixir-lang.org/getting-started/processes.html या लिटिल एलिक्सीर और ओटीपी गाइड यदि आप प्रक्रियाओं और ओटीपी मंच पर गहराई से देखना चाहते हैं। –
@Onorio यह एक अच्छा विचार क्यों नहीं है? – user3790827
@ user3790827 मैंने यह नहीं कहा कि यह एक अच्छा विचार नहीं है। मैंने कहा कि मुझे यकीन नहीं है कि यह जाने का सबसे अच्छा तरीका है। यह कहना मुश्किल है कि मेरे पास आपके प्रश्न का लगभग कोई संदर्भ नहीं है। –