Agent
Страница документации начинается с примера, который вы можете использовать как есть. В основном: в Elixir вы хотите использовать с именем GenServer
s, чтобы искать их по name
, а не по pid
.
Этот подход имеет много преимуществ, например, name
не изменяется при перезапуске сервера, а pid
-.
Итак, вы делаете следующее:
defmodule HelloBlockchain.Monitor do
use Agent
def start_link do
# __MODULE__ here would be HelloBlockchain.Monitor
Agent.start_link(fn -> %{} end, name: __MODULE__)
end
def put(key, value) do
Agent.update(__MODULE__, &Map.put(&1, key, value))
end
def get(key) do
Agent.get(__MODULE__, &Map.get(&1, key))
end
end
И все готово; Agent.get(HelloBlockchain.Monitor, :foo)
будет работать откуда угодно (при условии, что Agent
действительно запущен и контролируется).
Очевидно, вам не нужно сохранять имя, вы просто даете имя, которое предопределено и известно. Общий подход в Elixir заключается в использовании имени модуля, в который вложен этот агент.