在初始化Erlang supervisor进程时添加gen_事件处理程序

在初始化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

我正在学习Erlang,并设法相对高效地找到大多数问题的答案和解决方案,但我花了大量时间来解决这一问题:

向主管进程正在启动的gen_事件模块添加处理程序的正确方法是什么?到目前为止,在我的探索中,我已经能够设置进程、gen_服务器、监控器(启动gen_服务器)和gen_事件模块,但我试图向gen_事件添加处理程序的所有操作都会使我的监控器进程崩溃,有时甚至会使我的shell崩溃

主管模块:

-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”和尝试发送消息都证实了这一点
我想结合两件事:

  • 将特定的事件处理程序(例如,“发送osc”)附加到我的gen_事件流程中…希望是从主管代码中
  • 将初始化参数传递给osc_事件_服务器模块;我希望至少能够为UDP服务器指定端口(而不是硬连接“8980”),并提供我希望进程与之通信的远程UDP服务器的IP+端口

  • 非常感谢。对你看到的任何事物都要批判……例如,我的整个方法:正如我在这一点上所理解的那样,我确信,与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};
    ...