GenEvent поведение
Менеджер событий с поведением обработчиков событий.
Если вы заинтересованы в реализации менеджера событий, пожалуйста, прочтите раздел «Альтернативы» ниже. Если вам необходимо реализовать обработчик событий для интеграции с существующей системой, такой как Elixir's Logger, пожалуйста, используйте :gen_event вместо этого.
Альтернативы
Существует несколько подходящих альтернатив GenEvent. Каждая из них может быть наиболее выгодной в зависимости от варианта использования.
Надзорщик и GenServers
Одна альтернатива GenEvent — очень простое решение, состоящее из использования надзорщика и нескольких GenServers, запущенных под его управлением. Надзорщик выступает в качестве «менеджера событий», а дочерние GenServers — в качестве «обработчиков событий». Этот подход имеет некоторые недостатки (например, он не предоставляет обратной связи для предотвращения перегрузки), но всё же может заменить GenEvent для простых случаев его использования. Эта статья в блоге от José Valim содержит более подробную информацию об этом подходе.
GenStage
Если в случае использования GenEvent требуется более сложная логика, GenStage предоставляет отличную альтернативу. GenStage — внешняя библиотека Elixir, поддерживаемая командой Elixir; она предоставляет инструмент для реализации систем, которые обмениваются событиями в режиме запроса-ответа с встроенной поддержкой обратной связи для предотвращения перегрузки. Обратитесь к документации GenStage для получения дополнительной информации.
:gen_event
Если ваш случай использования требует именно того, что предоставлял GenEvent, или вам необходимо интегрироваться с существующей системой, основанной на :gen_event, вы всё ещё можете использовать :gen_event модуль Erlang.
Сводка
Типы
Обработчики вызовов
Типы
handler()Исходный код
@type handler() :: atom() | {atom(), term()}manager()Исходный код
@type manager() :: pid() | name() | {atom(), node()}name()Исходный код
@type name() :: atom() | {:global, term()} | {:via, module(), term()}on_start()Исходный код
@type on_start() :: {:ok, pid()} | {:error, {:already_started, pid()}}options()Исходный код
@type options() :: [{:name, name()}]Обработчики вызовов
code_change(old_vsn, state, extra)Исходный код
@callback code_change(old_vsn, state :: term(), extra :: term()) ::
{:ok, new_state :: term()}
when old_vsn: term() | {:down, term()}handle_call(request, state)Исходный код
@callback handle_call(request :: term(), state :: term()) ::
{:ok, reply, new_state}
| {:ok, reply, new_state, :hibernate}
| {:remove_handler, reply}
when reply: term(), new_state: term()handle_event(event, state)Исходный код
@callback handle_event(event :: term(), state :: term()) ::
{:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()handle_info(msg, state)Исходный код
@callback handle_info(msg :: term(), state :: term()) ::
{:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()init(args)Исходный код
@callback init(args :: term()) ::
{:ok, state} | {:ok, state, :hibernate} | {:error, reason :: any()}
when state: any()terminate(reason, state)Исходный код
@callback terminate(reason, state :: term()) :: term()
when reason:
:stop | {:stop, term()} | :remove_handler | {:error, term()} | term()
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.14.1/GenEvent.html