です。あなたが唯一のノードごとに1つの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
名プロセスへ。
:ets
プロセスを識別するための追加情報が必要な場合は、
: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
ファイルに追加することができます。決して、これまでhandle_call/3
内からGenServer.call/3
を呼び出し、サイドノートでは
(...)
defp deps do
[{:gproc, github: "uwiger/gproc"}]
end
(...)
。それはあなたの他のGenServer.call
でタイムアウトし、DOSを行います。 handle_call/3
は、その時点で1つのメッセージを処理します。
Onorio氏のように、GenServer.call(self、request)を使用することができます。プロセスとOTPプラットフォームの詳細を知りたい場合は、 http://elixir-lang.org/getting-started/processes.html またはLittle Elixir and OTP Guideを参照してください。 –
@Onorioなぜそれは良い考えではありませんか? – user3790827
@ user3790827いい考えではないとは言いませんでした。私はそれが最善の方法だとはっきりしないと言いました。あなたの質問に文脈がほとんどないことを考えると、本当に難しいです。 –