檢視原始碼 GenEvent 行為 (Elixir v1.16.2)
此行為已棄用。請改用 Erlang/OTP 的 :gen_event 模組。
具有事件處理器行為的事件管理員。
如果您有興趣實作事件管理員,請閱讀下方的「替代方案」區段。如果您必須實作事件處理器以整合現有系統,例如 Elixir 的記錄器,請改用 :gen_event
。
替代方案
有幾個適合的替代方案可以取代 GenEvent。每個替代方案都可能根據使用案例帶來最大的效益。
監督程式和 GenServer
GenEvent 的一個替代方案是一個非常簡化的解決方案,包括使用一個監督程式和在它之下啟動的多個 GenServer。監督程式扮演「事件管理員」的角色,而子項 GenServer 扮演「事件處理器」的角色。此方法有一些缺點(例如,它不提供反壓力),但仍可以用於低調使用 GenEvent 的情況。José Valim 的這篇部落格文章對此方法有更詳細的資訊。
GenStage
如果您使用 GenEvent 的使用案例需要更複雜的邏輯,GenStage 提供了一個極佳的替代方案。GenStage 是由 Elixir 團隊維護的外部 Elixir 函式庫;它提供一個工具來實作以需求驅動的方式交換事件的系統,並內建反壓力的支援。請參閱 GenStage 文件 以取得更多資訊。
:gen_event
如果您的使用案例需要 GenEvent 提供的完全相同功能,或者您必須整合現有的 :gen_event
為基礎的系統,您仍然可以使用 :gen_event
Erlang 模組。
類型
@type on_start() :: {:ok, pid()} | {:error, {:already_started, pid()}}
@type options() :: [{:name, name()}]
回呼
@callback code_change(old_vsn, state :: term(), extra :: term()) ::
{:ok, new_state :: term()}
when old_vsn: term() | {:down, term()}
@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()
@callback handle_event(event :: term(), state :: term()) ::
{:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()
@callback handle_info(msg :: term(), state :: term()) ::
{:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()
@callback init(args :: term()) ::
{:ok, state} | {:ok, state, :hibernate} | {:error, reason :: any()}
when state: any()
@callback terminate(reason, state :: term()) :: term()
when reason:
:stop | {:stop, term()} | :remove_handler | {:error, term()} | term()