gpt4 book ai didi

events - 确保在 Erlang/OTP 中切换 gen_event 处理程序时处理事件

转载 作者:行者123 更新时间:2023-12-02 02:24:57 24 4
gpt4 key购买 nike

假设我有多个版本的 gen_event 处理程序,并且希望在程序运行时更改它们:

-module(logger_all).
-behaviour(gen_event).
-export([init/1, handle_event/2, terminate/2]).
init(_Args) ->
{ok, []}.
handle_event({Severity, ErrorMsg}, State) ->
io:format("***~p*** ~p~n", [Severity, ErrorMsg]),
{ok, State}.
terminate(_Args, _State) ->
ok.

-module(logger_errors_only).
-behaviour(gen_event).
-export([init/1, handle_event/2, terminate/2]).
init(_Args) ->
{ok, []}.
handle_event({error, ErrorMsg}, State) ->
io:format("***Error*** ~p~n", [ErrorMsg]),
{ok, State}.
handle_event({_, ErrorMsg}, State) ->
{ok, State}. %% ignore everything except errors
terminate(_Args, _State) ->
ok.

显然,我可以通过删除一个处理程序并添加另一个处理程序来切换它们:

log_errors_only() -> 
gen_event:delete_handler(error_man, logger_all, []),
gen_event:add_handler(error_man, logger_errors_only, []).

但这留下了竞争条件的可能性;如果 error_man 在错误的时间收到事件,则不会记录该事件。或者如果我改变操作的顺序,它将被记录两次,这也是不可取的。我如何确保它被精确处理一次?

对于这种情况,我可以只有一个处理程序并将日志记录级别保持为 State,但假设这是 Not Acceptable 。

最佳答案

OTP团队擅长预见这样的需求; gen_event 有一个函数 swap event handlers原子地:

log_errors_only() ->
gen_event:swap_handler(error_man,
{logger_all, swapped_out},
{logger_errors_only, []}).

关于events - 确保在 Erlang/OTP 中切换 gen_event 处理程序时处理事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3767902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com