问题标签 [erlang-supervisor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
228 浏览

erlang - 补偿 one_for_one 主管无法重新启动子进程:tcp/ip 端口侦听器

我创建了一个封装 tcp/ip 功能的通用行为。该行为的用户所要做的就是实现处理来自套接字另一侧的任何已解析“命令”的回调。

我的通用行为创建了一个端口侦听器进程,该进程通过 gen_tcp:accept 侦听端口。当有人连接到端口时,端口侦听器要求主管启动一个新的端口侦听器,同时继续处理与刚刚连接的任何客户端的套接字通信。因为这些端口侦听器/套接字处理程序中的每一个都是动态创建且相同的,所以我使用 simple_one_for_one 主管来创建它们。标准的东西。

这是我的问题。如果端口侦听进程终止,则整个行为将不起作用,因为将没有任何东西在侦听端口。因为 port-listener 是由 simple_one_for_one supervisor 创建的,supervisor 不能重新启动一个新的 port_listener。

那么,我是否创建了一个 keep_alive 进程来监视“最新”端口侦听器并要求 superviosr 在它死后启动另一个?或者,对于这种类型的案例是否还有其他一些最佳实践。

此外,有没有办法查看/检查此行为创建的过程?它不是一个应用程序,所以 appmon 在这里不起作用。

谢谢

0 投票
2 回答
484 浏览

erlang - Simple_one_for_one 应用程序

我有一个主管,它开始 simple_one_for_one 孩子。每个孩子实际上都是一个主管,有自己的树。每个孩子都有一个唯一的 ID,所以我可以区分它们。然后每个 gen_server 都以 start_link(Id) 启动,其中:

因此,每个 gen_server 都可以轻松地使用 {global, {Id, module_name}} 进行寻址。

现在我想让这个儿童主管进入应用程序。所以,我的母亲主管应该开始申请而不是主管。这应该很简单,除了一个部分:将 ID 传递给应用程序。使用 ID 启动主管很容易:supervisor:start_child(?SERVER, [Id])。我该如何申请?如何使用不同的 ID 启动多个同名应用程序(这样我可以访问同一个 .app 文件)(这样我就可以使用 supervisor:start_child(?SERVER, [Id]) 启动我的孩子)?

如果我的问题不够清楚,这是我的代码。因此,目前,es_simulator_dispatcher启动es_simulator_sup。我想要这个:es_simulator_dispatcher 启动 es_simulator_app 启动 es_simulator_sup。这里的所有都是它的 :-)

在此先感谢,dijxtra

0 投票
2 回答
1670 浏览

erlang - Erlang:在主管下产生多个进程

我正在尝试实现一个简单的主管,如果它们失败,只需让它重新启动子进程。但是,我什至不知道如何在主管下生成多个进程!我在这个网站上查看了简单的主管代码,发现了一些东西

我假设将“echo_server2”部分放在 init() 函数中会在这个主管下产生另一个进程,但我最终得到一个异常 exit:shutdown 消息。

文件“echo_server”和“echo_server2”代码相同,但名称不同。所以我现在很困惑。

0 投票
1 回答
592 浏览

erlang - erlang主管重启策略

我想作为给定主管的孩子启动几个进程。重启策略是one_for_one为了我的需要,每个终止的进程都应该在给定的时间(例如 20 秒)后重启。

如何才能做到这一点?可能会延迟 init 或终止函数,并结合:

有没有更好的方法来实现这一目标?

0 投票
1 回答
1252 浏览

erlang - Erlang 主管。重启进程,如果多次失败,放弃并发送消息

我有几个gen_server工人定期从硬件传感器请求一些信息。传感器可能会暂时失效,这是正常的。如果传感器失败,工作人员会因异常而终止。

所有工人都是从具有simple_one_to_one策略的主管中产生的。我还有一个控件gen_server,它可以启动和停止工作人员,还可以接收'DOWN'消息。

所以现在我有两个问题:

  1. 如果工作人员由主管重新启动,则其状态将丢失,这对我来说是不可接受的。我需要重新创建具有相同状态的工人。

  2. 如果工人在一段时间内多次失败,则传感器发生了严重的事情,需要操作员注意。因此我需要放弃重新启动工作程序并向事件处理程序发送消息。但是主管的默认行为是在耗尽进程重启限制后终止。

我看到两个解决方案:

  1. 将supervisor中的进程类型设置为临时并控制它们并在控制中重新启动它们gen_server。但这正是主管应该做的,所以我在重新发明轮子。

  2. 为主要主管下的每个工人创建一个主管。这正好解决了我的第二个问题,但是重启后worker的状态会丢失,因此我需要一些像ets table这样的存储来存储worker的状态。

我对 Erlang 很陌生,所以我需要一些关于我的问题的建议,关于哪种(如果有的话)解决方案是最好的。提前致谢。

0 投票
1 回答
673 浏览

erlang - 主管启动多个孩子作为原子操作

我需要以原子方式启动多个主管子级。也就是说,如果组中的一个孩子在启动时失败,那么他们都不应该启动。

我将此操作视为一个函数:

我应该如何以适当的方式实现这一点?任何示例,库等?我的直觉告诉我,从列表中启动所有孩子,检查他们是否都成功,然后杀死剩下的孩子不是办法。

或者也许我的设计有缺陷,我真的不需要做这些事情?

0 投票
1 回答
160 浏览

debugging - 如何在 Erlang 中跟踪函数调用?

我在 my_sup.erl 中有一个函数,如下所示:

但是ems_media.erl中没有名为start_link/1的函数,我想知道为什么运行时没有错误

那么,如何知道调用 init([ems_media_sup]) 之后发生了什么

0 投票
1 回答
623 浏览

erlang - simple_one_for_one 孩子无法启动

我写了一些代码来测试 simple_one_for_one 主管,但它不能工作,代码是:

当我跑

test_simple_one_for_one:start_link().

在 erl shell 中,它给了我错误:

test_simple_one_for_one:start_fun_test()。** 异常退出:{noproc,{gen_server,call, [test_simple_one_for_one,{start_child,[]},infinity]}} 在函数 gen_server:call/3 中(gen_server.erl,第 188 行)

0 投票
1 回答
513 浏览

erlang - erlang 主管处理 ibrowse 的最佳方法:send_req conn_failed

Erlang 新手,只是在理解新范式时遇到了一些麻烦!

好的,所以我在 OTP gen_server 中有这个内部函数:

如果我忽略了处理连接失败的情况,那么我会收到一个传播到主管的退出信号,它会与服务器一起关闭。

我想要发生的事情(至少我认为这是我想要发生的事情)是在连接失败时我想暂停然后重试 send_req 说 10 次,此时主管可能会失败。

如果我做这种丑陋的事情......

它会关闭服务器进程,是的,我可以使用我的(在 10 秒内尝试 10 次)重启策略,直到它失败,这也是预期的结果,但是当我从服务器到主管的返回值是“好的”时真的很想返回 {error,error_but_please_dont_fall_over_mr_supervisor}。

在这种情况下,我强烈怀疑我应该处理所有业务问题,例如在“my_func”中重试失败的连接,而不是试图让进程停止,然后让主管重新启动它以便再次尝试。

问题:在这种情况下,“Erlang 方式”是什么?

0 投票
1 回答
2079 浏览

erlang - 当我尝试从 eshell 启动时,我的主管崩溃了?

我对 OTP 很陌生,我正在尝试创建简单的示例来了解主管的行为:

这是简单的增量服务器

我想让它由这个模块监督:

之后,我在 erlang shell 中执行了后续步骤:

在此之后我尝试了下一个(正如我所料我有错误):

在此之后,我期望 - 我的主管重新启动inc_serv。但它没有:

你能帮我理解发生了什么吗?我应该如何重写我的主管,使其能够重新启动inc_serv

谢谢