Pull to refresh

Comments 13

Я должен ещё добавить что динамические атомы в Erlang / Elixir это очень плохо — ведёт к memory leak, не используйте динамически созданные атомы для регистрации процессов, используйте gproc. Да, и лучше вообще не создавайте атомы динамически нигде и никогда если на 100% не уверены в том что делаете.

Да, все так. Но в статье они не используются или я что-то пропустил?
Имя вида :chat_room оно ведь просто в коде написано

В статье всё ok, прост это частые грабли начинающих OTP разработчиков)
Статья о том и ни о чём. Начинать нужно с паттернов OTP, что такое монитор, супервизор, акторы и так далее и уже потом показывать как это можно и нужно использовать, желательно сперва на erlang.
UFO just landed and posted this here
прямо уж тысячи? например?
UFO just landed and posted this here
а можно пару примеров. я бы почитал. (варианты — вот есть супервизор, он ваще крут — не предлагать)

А мне было полезно с точки зрения методологии регистрации процессов в Elixir: что, зачем и почему. Если начинать с паттернов, вообще с Erlang, то статья получится не подъемная. Здесь автор статьи вопрос пропедевтики разрешает вполне корректно, написав: "Если такой код кажется вам незнакомым или не понятным — почитайте начало работы с Elixir, в котором есть отличные параграфы об OTP."

В общем, статья полезная: у Саши Юрича эта тема несколько скомкана, но это понятно - книга не резиновая.

И за эту статью тоже спасибо! Буквально вчера по всем этим проблемам проходил, запускал sup с именованием процесса.

Почему-то был уверен, что в Erlang не нужно знать Pid для вызова call, а сейчас пересмотрел код и понял, что был не прав:

% erlang
    -define(SERVER, ?MODULE).
...
    gen_server:call(?SERVER, {select, Key}).

% elixir
    GenServer.call(__MODULE__, {:select, key})


Вообще тяжело, конечно, после Erlang на Elixir. Дважды атом указывал без двоеточия. И после Erlang называть переменные с маленькой буквы — тоже не привычно. А вот с параметрами местами пока вообще непонятки, типа [type: :set]

Все непонятные параметры — это синтаксический сахар к понятным параметрам.
Все очень хорошо описано на сайте elixir в разделе basic types

Имхо, в примере:

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/2unregister_name/1whereis_name/1 и send/2.

Абсолютно непонятно тогда, почему у штатного модуля Registry интерфейс отличается: register/3unregister/2,  lookup/2 и аналог send/2 отсутствует?

Sign up to leave a comment.

Articles