问题标签 [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 投票
2 回答
189 浏览

erlang - 主管行为

在实施主管时..如果在主管模块中,我做类似的事情

init([_]) ->
{ok,
{{one_for_one, 5, 60},
[{reverese, {reverse, start_reverse, []}, Permanent, Brut_kill, worker,[]}]}}。

反向函数是:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[])。

它不会起作用,因为 start_reverse 函数在每种情况下都会正常退出。但是,当我添加这样的一行时:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[]),
{ok,Pid}。

即使函数正常退出,它也可以工作。有人可以解释为什么吗?

0 投票
1 回答
800 浏览

process - 主管子与普通 spawn_link

我有一个名为“monitor_node”的进程层次结构。这些monitor_nodes中的每一个都由一个监督者监督。

现在,这些节点中的每一个都可能具有复杂的内部结构。意思是,它可能(或可能没有)具有正常运行所需的一些子流程。示例:发送保持活动消息的进程。到目前为止,我一直在使用普通的 spawn_link 来创建这些“内部”进程。

但是,我已经意识到在 monitor_node 的 init 函数中生成它们(正在被监督)有时会导致该函数失败(因此整个监督树失败)。我的问题是:将这些内部流程附加到主管树是否是一个好的解决方案?我正在考虑将 monitor_node 更改为监督其内部流程的主管。

我的疑问是:

  1. 我将不得不监督相当数量的非常小的流程。我不确定这是否是一个好习惯。

  2. 我可能事先不知道给定的“内部”流程是一个简单的流程或具有一些内部结构(也产生其他流程)。如果是后者,那么我可能应该将这些“内部-内部”进程附加到主管树。

我希望我没有让你太困惑。期待答案。

编辑:

此处讨论了一个非常相似(如果不相同)的问题(第 3 篇文章)。给出的解决方案与我给出的废话答案几乎相同。

0 投票
4 回答
610 浏览

erlang - 如何处理 gen_fsm 的终止

我有一个生成 gen_fsm 行为实现的主进程,但这个主进程不是主管行为的实现,它只是另一个模块。假设 gen_fsm 的实现称为 GAME_ROOM。我的情况是这样的:

  1. 当有 3 个人准备好时,主进程将产生一个新的 GAME_ROOM。
  2. 我使用 gen_fsm:start_link 函数来启动一个新的 GAME_ROOM,所以如果 GAME_ROOM 错误退出,我的 MAIN 进程可以产生一个新的进程,以替换停机的进程。
  3. 我设法让我的主进程检测到所有被击落的 GAME_ROOM 的 EXIT 事件

问题是:我需要在新的 GAME_ROOM 状态中恢复所有已关闭的状态。我的问题是:如何使用 gen_fsm 的终止功能将 gen_fsm 的最新状态传递给我的 MAIN 进程,所以当我重生一个新的 GAME_ROOM 时,我可以传递这些状态?

0 投票
3 回答
848 浏览

erlang - gen_server 是否已启动?

有没有办法告诉 gen_server:“主管已经初始化了所有 gen_servers,现在你可以发送消息”?

我有一个工人 gen_server,他的工作是在他的监督树中设置其他 gen_servers 的状态。如果我刚开始在配置服务器的 init 函数中发送消息,有时它会得到 {noproc, _}。我想这意味着配置服务器很快:他在主管有足够的时间启动所有工作人员之前发送了消息。我通过将 timer:sleep(500) 放入 config_server:init() 来解决这个问题,这确保了所有 gen_server 都有足够的时间进行初始化,但这似乎是一个不优雅的解决方案。

有没有合适的方法来做到这一点?

0 投票
1 回答
271 浏览

erlang - 收集有关 simple_one_for_one 工人的信息

我有一个主管(称为 alice),它启动了一堆 of_one_for_one 工人。现在我想获得一些关于所有作品的信息。例如,假设工作人员是 TCP 服务器,我想获取工作人员使用的所有端口号,或连接到这些工作人员的所有远程地址。我应该把这个功能放在哪里?

Supervisor 没有 gen_server 功能,无法接听电话。因此,在我看来,最合理的方法是让另一个主管(称为 bob)产生主管 alice 和另一个 gen_server(charile),它通过调用主管:which_children(alice)然后询问来实现 {get, ports_used_by_alices_workers} 等调用每个爱丽丝的孩子都是为了它的港口。因此,charile 是爱丽丝的兄弟姐妹,并接听有关爱丽丝孩子的电话。那样可以么?还是有更优雅的方式来做到这一点?

0 投票
1 回答
1840 浏览

erlang - simple_one_for_one start_child() 返回 already_started

我有一个应该开始simple_one_for_one工人的主管。当我第一次打电话start_child()时,一切都很顺利。但是,当我第二次这样做时,我得到了{error,{already_started,<0.71.0>}}. 为什么simple_one_for_one主管会给我回一个already_started?我错过了什么?

这是代码:supervisorworker

0 投票
2 回答
361 浏览

erlang - Erlang Supervisors - 共享进程邮箱

我有一个监控两个子进程的主管进程;一个主进程和一个备份进程(以防主进程退出)。

如果主进程在其邮箱中仍有邮件时出现故障,是否有办法让备份进程接管并处理留在原始主进程邮箱中的邮件?

0 投票
2 回答
1009 浏览

erlang - Erlang主管:如何检查是否所有工人都已回复

我有一个有 N 个工作进程的主管。像往常一样,主管可以向工作进程发送消息,并且有一个handle_cast从工作人员向主管发送回复的消息。

如何检查所有 N 名员工是否都已回复主管?是否可以通过任何类型的事件处理来实现这一点 - 即告诉主管“好的,每个人都已回复”,而不是让主管在某种 ETS 中每秒检查“所有 N 个进程都已回复”状态子注册表?

0 投票
2 回答
151 浏览

erlang - 监督重启进程的子进程

我有这样的结构

在这个结构中,child1 受到监督并产生 child2。我需要的是能够在 child2 崩溃/退出时重新启动 child1。实现这一目标的最佳方法是什么?

0 投票
2 回答
936 浏览

erlang - Erlang OTP 主管

我正在研究 Erlang Programming 一书中的练习 12-2。我有一个模块db_server_otp实现 OTP gen_server 行为。作为一个独立的模块,我已经对其进行了测试,它可以按预期工作。我现在必须为它添加一个主管。基于本章中的示例,我创建了一个模块db_server_sup,如下所示:

两个模块都位于同一个目录中,我用 .beam 文件编译的两个模块位于我启动 erlang shell 的同一个工作目录中。但是,使用 erlang shell,我无法启动主管。

我必须导入db_server_otp模块吗?如果是这样,我必须导入哪些功能?我在db_server_otp中导出我所有的 OTP 方法: