问题标签 [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.
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}。
即使函数正常退出,它也可以工作。有人可以解释为什么吗?
process - 主管子与普通 spawn_link
我有一个名为“monitor_node”的进程层次结构。这些monitor_nodes中的每一个都由一个监督者监督。
现在,这些节点中的每一个都可能具有复杂的内部结构。意思是,它可能(或可能没有)具有正常运行所需的一些子流程。示例:发送保持活动消息的进程。到目前为止,我一直在使用普通的 spawn_link 来创建这些“内部”进程。
但是,我已经意识到在 monitor_node 的 init 函数中生成它们(正在被监督)有时会导致该函数失败(因此整个监督树失败)。我的问题是:将这些内部流程附加到主管树是否是一个好的解决方案?我正在考虑将 monitor_node 更改为监督其内部流程的主管。
我的疑问是:
我将不得不监督相当数量的非常小的流程。我不确定这是否是一个好习惯。
我可能事先不知道给定的“内部”流程是一个简单的流程或具有一些内部结构(也产生其他流程)。如果是后者,那么我可能应该将这些“内部-内部”进程附加到主管树。
我希望我没有让你太困惑。期待答案。
编辑:
此处讨论了一个非常相似(如果不相同)的问题(第 3 篇文章)。给出的解决方案与我给出的废话答案几乎相同。
erlang - 如何处理 gen_fsm 的终止
我有一个生成 gen_fsm 行为实现的主进程,但这个主进程不是主管行为的实现,它只是另一个模块。假设 gen_fsm 的实现称为 GAME_ROOM。我的情况是这样的:
- 当有 3 个人准备好时,主进程将产生一个新的 GAME_ROOM。
- 我使用 gen_fsm:start_link 函数来启动一个新的 GAME_ROOM,所以如果 GAME_ROOM 错误退出,我的 MAIN 进程可以产生一个新的进程,以替换停机的进程。
- 我设法让我的主进程检测到所有被击落的 GAME_ROOM 的 EXIT 事件
问题是:我需要在新的 GAME_ROOM 状态中恢复所有已关闭的状态。我的问题是:如何使用 gen_fsm 的终止功能将 gen_fsm 的最新状态传递给我的 MAIN 进程,所以当我重生一个新的 GAME_ROOM 时,我可以传递这些状态?
erlang - gen_server 是否已启动?
有没有办法告诉 gen_server:“主管已经初始化了所有 gen_servers,现在你可以发送消息”?
我有一个工人 gen_server,他的工作是在他的监督树中设置其他 gen_servers 的状态。如果我刚开始在配置服务器的 init 函数中发送消息,有时它会得到 {noproc, _}。我想这意味着配置服务器很快:他在主管有足够的时间启动所有工作人员之前发送了消息。我通过将 timer:sleep(500) 放入 config_server:init() 来解决这个问题,这确保了所有 gen_server 都有足够的时间进行初始化,但这似乎是一个不优雅的解决方案。
有没有合适的方法来做到这一点?
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 是爱丽丝的兄弟姐妹,并接听有关爱丽丝孩子的电话。那样可以么?还是有更优雅的方式来做到这一点?
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
?我错过了什么?
这是代码:supervisor,worker。
erlang - Erlang Supervisors - 共享进程邮箱
我有一个监控两个子进程的主管进程;一个主进程和一个备份进程(以防主进程退出)。
如果主进程在其邮箱中仍有邮件时出现故障,是否有办法让备份进程接管并处理留在原始主进程邮箱中的邮件?
erlang - Erlang主管:如何检查是否所有工人都已回复
我有一个有 N 个工作进程的主管。像往常一样,主管可以向工作进程发送消息,并且有一个handle_cast
从工作人员向主管发送回复的消息。
如何检查所有 N 名员工是否都已回复主管?是否可以通过任何类型的事件处理来实现这一点 - 即告诉主管“好的,每个人都已回复”,而不是让主管在某种 ETS 中每秒检查“所有 N 个进程都已回复”状态子注册表?
erlang - 监督重启进程的子进程
我有这样的结构
在这个结构中,child1 受到监督并产生 child2。我需要的是能够在 child2 崩溃/退出时重新启动 child1。实现这一目标的最佳方法是什么?
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 方法: