在初始化Erlang supervisor进程时添加gen_事件处理程序
我正在学习Erlang,并设法相对高效地找到大多数问题的答案和解决方案,但我花了大量时间来解决这一问题: 向主管进程正在启动的gen_事件模块添加处理程序的正确方法是什么?到目前为止,在我的探索中,我已经能够设置进程、gen_服务器、监控器(启动gen_服务器)和gen_事件模块,但我试图向gen_事件添加处理程序的所有操作都会使我的监控器进程崩溃,有时甚至会使我的shell崩溃 主管模块:在初始化Erlang supervisor进程时添加gen_事件处理程序,erlang,erlang-supervisor,gen-event,Erlang,Erlang Supervisor,Gen Event,我正在学习Erlang,并设法相对高效地找到大多数问题的答案和解决方案,但我花了大量时间来解决这一问题: 向主管进程正在启动的gen_事件模块添加处理程序的正确方法是什么?到目前为止,在我的探索中,我已经能够设置进程、gen_服务器、监控器(启动gen_服务器)和gen_事件模块,但我试图向gen_事件添加处理程序的所有操作都会使我的监控器进程崩溃,有时甚至会使我的shell崩溃 主管模块: -module(sup). -behaviour(supervisor). %% API -expor
-module(sup).
-behaviour(supervisor).
%% API
-export([start_link/0, init/1]).
-export([stop/0]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init(_) ->
EventServerSpec = #{
id => osc_event_server,
start => {gen_event, start_link, [{local, osc_server}]},
modules => dynamic
},
ChildSpecList = [EventServerSpec, child(frequency), child(bkpt_server)],
SupFlags = #{strategy => rest_for_one,
intensity => 2, period => 3600},
{ok, {SupFlags, ChildSpecList}}.
child(Module) ->
#{id => Module,
start => {Module, start_link, []},
restart => permanent,
shutdown => 2000,
type => worker,
modules => [Module]}.
…以及来自gen_事件模块、osc_事件服务器的一些信息(希望是相关信息!)
尽管我对gen_事件行为的理解很差,但运行包含以下代码片段的代码的结果并不让我感到惊讶:
- 它发射时不会坠毁
- 它启动gen_事件并为其生成一个可参考的Pid,但从不点击“osc_事件服务器”的
块init
- gen_事件没有实际的事件处理程序。“which_handlers”和尝试发送消息都证实了这一点
非常感谢。对你看到的任何事物都要批判……例如,我的整个方法:正如我在这一点上所理解的那样,我确信,与Erlang的误解相比,没有什么。 < P>你应该把<代码> GeNEngEngs</Case>进程看作是存在于你的节点上的一种服务。通常你会给它起个名字,然后用这个名字跟它说话。在此之前,它只是一段独立的代码 这意味着,如果您想添加处理程序,鉴于您不能在主管内运行任意代码来执行此操作,最简单的方法是让您的主管在
genu事件
进程准备就绪后生成同级进程
将新的兄弟姐妹标记为
暂时的
或临时的
,使其成为一个小的gen\u服务器
或supervisor\u桥
工作者,并为其指定gen\u事件的名称和处理程序
。小工人应该添加处理程序。然后,它可以根据原因关闭正常
,或者如果需要,监督处理程序以防它们崩溃,重新添加它们。@IGTA:我已经投票并怀疑这是一个很好的解决方案,但不幸的是,还没有时间尝试。我将能够在接下来的几天内进行测试,不用担心,当(正如我所怀疑的)我可以用我自己的结果支持这一点时,我将标记为可接受的解决方案。
...
init([]) ->
{ok, Socket} = gen_udp:open(8980, [binary, {active, false}]),
{ok, #{socket => Socket, target_port => get_target_port()}}.
...
handle_event({send_osc, Path, Data}, State) ->
TargetPort = maps:get(target_port, State),
Socket = maps:get(socket, State),
sendMessage(Socket, TargetPort, Path, Data),
{ok, State};
...