Комментарии 13
А мне было полезно с точки зрения методологии регистрации процессов в Elixir: что, зачем и почему. Если начинать с паттернов, вообще с Erlang, то статья получится не подъемная. Здесь автор статьи вопрос пропедевтики разрешает вполне корректно, написав: "Если такой код кажется вам незнакомым или не понятным — почитайте начало работы с Elixir
, в котором есть отличные параграфы об OTP."
В общем, статья полезная: у Саши Юрича эта тема несколько скомкана, но это понятно - книга не резиновая.
Почему-то был уверен, что в Erlang не нужно знать Pid для вызова call, а сейчас пересмотрел код и понял, что был не прав:
% erlang
-define(SERVER, ?MODULE).
...
gen_server:call(?SERVER, {select, Key}).
% elixir
GenServer.call(__MODULE__, {:select, key})
Вообще тяжело, конечно, после Erlang на Elixir. Дважды атом указывал без двоеточия. И после Erlang называть переменные с маленькой буквы — тоже не привычно. А вот с параметрами местами пока вообще непонятки, типа [type: :set]
Имхо, в примере:
iex> {:ok, pid} = Chat.Server.start_link("room1")
{:ok, #PID<0.107.0>}
iex> Chat.Registry.start_link
{:ok, #PID<0.109.0>}
надо переставить предложения вызовов функций местами - сначала стартуем регистр, а затем сервер чата с регистрацией в регистре. Иначе, если следовать написанному, получаем сообщение об ошибке: "** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started"
Но тогда не понятно, почему затем выполнение предложения
Chat.Registry.whereis_name("room1")
дает :undefined, ведь "комната 1" при старте уже прошла регистрацию.
В статье говорится, что Опция :via
принимает в качестве параметра модуль, который имеет следующий интерфейс: register_name/2
, unregister_name/1
, whereis_name/1
и send/2.
Абсолютно непонятно тогда, почему у штатного модуля Registry интерфейс отличается: register/3
, unregister/2
, lookup/2 и аналог send/2 отсутствует?
Elixir: Регистрируем процессы — практическое руководство