非常教程

Elixir 1.5参考手册

GenEvent

GenEvent

警告:此模块已弃用。

如果您有兴趣实施活动经理,请阅读下面的“备选方案”部分。如果您必须实施事件处理程序才能与现有系统(如Elixir Logger)集成,请改用:gen_event

备选方案

有几个合适的替代方案来取代GenEvent。基于用例,它们中的每一个都可能是最有益的。

Supervisor和GenServers

GenEvent的一个替代方案是一个非常小的解决方案,包括使用一个监督器和多个启动的GenServers。主管充当“事件管理者”,而儿童GenServers充当“事件处理者”。这种方法有一些缺点(例如,它没有提供背压),但仍可以取代GenEvent以适应低调用途。JoséValim的这篇博文有关于这种方法的更详细的信息。

GenStage

如果您使用GenEvent的用例需要更复杂的逻辑,GenStage提供了一个很好的选择。GenStage是由Elixir团队维护的外部Elixir图书馆; 它提供了一个工具来实现系统,通过内置的背压支持以需求驱动的方式交换事件。有关更多信息,请参阅GenStage文档。

:gen_event

如果您的用例需要准确的GenEvent提供的内容,或者您​​需要与现有:gen_event的系统集成,您仍然可以使用:gen_eventErlang模块。

类型

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

GenEvent相关

Elixir 1.5

Elixir 基于 Erlang 虚拟机的函数式、面向并行,是一种较好的编程语言。它以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发。

主页 https://elixir-lang.org/
源码 https://github.com/elixir-lang/elixir
版本 1.5
发布版本 1.5.2