在线文档教程

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