GenEvent поведение
ПРЕДУПРЕЖДЕНИЕ: этот модуль устарел.
Если вы заинтересованы в реализации менеджера событий, пожалуйста, прочитайте раздел «Альтернативы» ниже. Если вам необходимо реализовать обработчик событий для интеграции с существующей системой, такой как Elixir's Logger, используйте :gen_event.
Альтернативы
Существует несколько подходящих альтернатив для замены GenEvent. Каждая из них может быть наиболее выгодной в зависимости от конкретного случая использования.
Supervisor и GenServers
Альтернативой GenEvent является очень простое решение, которое использует supervisor и несколько GenServers, запущенных под ним. Supervisor действует как «менеджер событий», а дочерние GenServers — как «обработчики событий». Этот подход имеет некоторые недостатки (например, он не предоставляет обратную связь), но все же может заменить GenEvent для использования с низкой нагрузкой. Эта статья блога от José Valim содержит более подробную информацию об этом подходе.
GenStage
Если сценарий использования, в котором вы использовали GenEvent, требует более сложной логики, GenStage предоставляет отличную альтернативу. GenStage — это внешняя библиотека Elixir, поддерживаемая командой Elixir; она предоставляет инструменты для реализации систем, которые обмениваются событиями по запросу с встроенной поддержкой обратной связи. Для получения дополнительной информации см. документацию GenStage.
:gen_event
Если ваш случай использования требует именно того, что предоставлял GenEvent, или вам необходимо интегрироваться с существующей :gen_event-базированной системой, вы по-прежнему можете использовать :gen_event модуль Erlang.
Краткое описание
Типы
- handler()
- manager()
- name()
- on_start()
- options()
Обработчики
- code_change(old_vsn, state, extra)
- handle_call(request, state)
- handle_event(event, state)
- handle_info(msg, state)
- init(args)
- terminate(reason, state)
Типы
handler()
handler() :: atom() | {atom(), term()} manager()
manager() :: pid() | name() | {atom(), node()} name()
name() :: atom() | {:global, term()} | {:via, module(), term()} on_start()
on_start() :: {:ok, pid()} | {:error, {:already_started, pid()}} options()
options() :: [{:name, name()}] Обработчики
code_change(old_vsn, state, extra)
code_change(old_vsn, state :: term(), extra :: term()) :: {:ok, new_state :: term()} when old_vsn: term() | {:down, term()} handle_call(request, state)
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)
handle_event(event :: term(), state :: term()) ::
{:ok, new_state} |
{:ok, new_state, :hibernate} |
:remove_handler when new_state: term() handle_info(msg, state)
handle_info(msg :: term(), state :: term()) ::
{:ok, new_state} |
{:ok, new_state, :hibernate} |
:remove_handler when new_state: term() init(args)
init(args :: term()) ::
{:ok, state} |
{:ok, state, :hibernate} |
{:error, reason :: any()} when state: any() terminate(reason, state)
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.5.3/GenEvent.html