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_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