问题标签 [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 回答
632 浏览

erlang - 动态启动子进程收到关机信号会导致异常

主管:

孩子:

supervisor:which_children(mod_guild_chapter_sup)

收到时的异常shutdown

如您所见,有一个undefined不应该存在的pid。

文档中有两个地方对此进行了解释,但它们之间存在冲突。

  1. temporary如果孩子不是,即使它返回,子规范将由主管保留ignore

start 定义用于启动子进程的函数调用。它必须是用作 apply(M,F,A) 的模块函数参数元组 {M,F,A}。

start 函数必须创建并链接到子进程,并且必须返回 {ok,Child} 或 {ok,Child,Info} 其中 Child 是子进程的 pid 和 Info 一个被主管忽略的任意术语。

如果子进程由于某种原因无法启动,启动函数也可以返回忽略,在这种情况下,子进程将由主管保留(除非它是临时子进程),但不存在的子进程将被忽略。

  1. simple_one_for_one如果启动时返回,pid 将不会添加到主管ignore

如果子进程启动函数返回忽略,则将子规范添加到主管(除非主管是 simple_one_for_one 主管,请参见下文),将 pid 设置为 undefined 并且函数返回 {ok,undefined}。

在 simple_one_for_one 监督者的情况下,当子进程启动函数返回忽略函数返回 {ok,undefined} 并且没有子进程添加到监督者。

我被文件弄糊涂了。我选择transient重启策略是因为孩子在崩溃时应该重启。但是我怎样才能在这里避免这个异常呢?

0 投票
1 回答
2208 浏览

elixir - Elixir 主管 - 你如何命名受监督的任务

我真的在和 Elixir 的主管们苦苦挣扎,想知道如何给他们命名以便我可以使用它们。基本上,我只是想启动一个Task我可以向其发送消息的监督。

所以我有以下内容:

项目入口点为:

在这一点上,我什至没有信心我正在使用正确的东西(Task特别是)。基本上,我想要的只是在应用程序启动时生成一个进程或任务或 GenServer 或任何正确的东西,我可以向其发送消息,这些消息本质上会执行System.cmd(cmd, opts). 我希望这个任务或过程受到监督。当我向它发送一条{:run, cmd, opts}消息时,例如{:run, "mv", ["/file/to/move", "/move/to/here"]}我希望它生成一个新任务或进程来执行该命令。对于我的使用,我什至不需要从任务中取回响应,我只需要它执行即可。任何关于去哪里的指导都会有所帮助。我已经通读了入门指南,但老实说,它让我更加困惑,因为当我尝试做已经完成的事情时,它永远不会像在应用程序中那样。

谢谢你的耐心。

0 投票
1 回答
146 浏览

erlang - 由 Erlang 中的主管杀死所有 gen_server

在 Erlang 中,我有一个主管 (my_sup) 模块来启动和监控 gen_server 进程 (my_gen)。当 my_gen 被修改、编译和加载时,我需要重新启动应用程序。

有没有更好的方法来杀死主管(my_sup)的所有进程(gen_server)并再次重新启动进程(gen_server)?

0 投票
1 回答
870 浏览

emacs - Erlang supervisor/gen_server 异常退出:noproc

我现在要疯了,试图弄清楚这是什么问题。

基本上我只想用 1 个服务器和 1 个 gen_event-behaviour 模块设置一个简单的主管。

现在的问题是我无法再启动它了,就是主管。

无论我做什么,我都会收到此错误:**异常退出:noproc

并且当使用文本跟踪器时,它显示它发生在 sRPG_supervisor:init/1 中。有了这个,您认为代码有问题,但是当我运行其他人的示例时,我得到了完全相同的结果(我已经下载了 Joe Armstrongs 示例并以相同的结果测试了 sellaprime_supervisor)。

当我在我的虚拟 Ubuntu 安装中运行它时,它曾经启动良好。然后我设置了它,这样我就可以在 Windows 中编码,但我什至从未测试过这种最简单的形式是否有效,而且显然出于某种原因它不起作用。

因此,如果有人遇到类似的问题,找到解决方案会很棒!我使用 erl6.3 作为带有 OTP 17 的 Erlang 版本。

这是我正在使用的代码,只是从 Emacs 生成的骨架中构建的:sRPG_supervisor.erl

sRPG_server.erl

sRPG_event_handler.erl

以下是发生情况的示例:

如您所见,在没有主管的情况下调用服务器时服务器可以正常工作。

我仔细研究了其他人遇到的类似问题,但无济于事。

0 投票
2 回答
638 浏览

erlang - Erlang supervisor动态改变重启强度

我的问题是,除了发布升级场景之外,是否可以修改已经运行的主管的重启强度阈值,如果可以,如何修改?

它以前从未出现过,但是运行一个最初没有孩子的主管,以便另一个进程通过主管启动孩子:start_child/2,所以我的 sup init/1 是这样的:

在主管开始时,可​​能的孩子数量是未知的;当然,它可能会从 10 到 10,000 甚至更多。

说 20 的重新启动强度对于 10 个孩子来说已经足够了,但是对于 10,000 个孩子,我希望能够增加它......并随着孩子数量由于正常终止而减少而减少它。

0 投票
1 回答
1205 浏览

concurrency - Elixir/Erlang 和 Cowboy - 如何使用主管

当您使用 Mix 创建应用程序时,它总是将根主管文件添加到项目中。注意监督函数中的“子规范”数组是空的。

应用程序.ex:

还会为您创建应用程序的入口点。通过我在网上找到的一些示例,我写了以下内容:

此应用程序有效,但如果我在 App.start() 中删除对 App.Supervisor.start_link() 的调用,有效

那么在这种情况下,主管是做什么的呢?如果主管的子规范是空的,那有什么意义呢?

例如,在此处找到的 Elixir 示例中 - https://github.com/IdahoEv/cowboy-elixir-example/blob/master/lib/cowboy_elixir_example.ex - 您可以看到启动主管的调用已被注释掉第 65 行。

但在官方 Cowboy Erlang 示例中,此文件 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl - 创建一个类似的没有子规范的根主管,然后调用它在此处的主应用程序文件中,第 22 行 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl

0 投票
2 回答
978 浏览

concurrency - Elixir - 基本主管设置崩溃而不是重新启动子进程

忽略没有 Mix 配置文件,我写了以下内容:

在第一次运行(iex -S mix)后没有重新启动应用程序就崩溃了。错误信息是:

但是,如果我改为直接Test.start()调用Test.Method.start(),如下所示:

然后它运行良好,但代码将不受监督。我很确定我在实施或理解方面犯了一个基本错误,但这个错误到底是什么?

0 投票
2 回答
1016 浏览

erlang - 如何跟踪erlang中的子进程?

我有一个包含信息的“主机”静态列表,以及一个“主机代理”的动态列表。每台主机只要通过 TCP 连接连接到服务器,就只有一个代理。由于主机可能已连接或未连接,因此其代理进程可能会或可能不会启动。当带有主机 ID 的 TCP 数据包到达时,我需要确定该主机的“代理”是否已启动。

Connection 负责从 tcp 套接字接收和发送数据,解析数据以找出它应该发送到哪个主机并交付给它的主机代理来处理。

主机保存主机信息。主机代理处理传入数据,将主机信息保存到主机并决定以什么格式发送什么(例如,使用主机 ID 和响应代码向客户端确认)。

并且在数据包中指定了源主机和目标主机,即源主机发送,目标主机接收。在这种情况下,目标主机可以连接到另一个连接中。这就是为什么需要所有连接的全局映射以方便获取目标主机代理 pid。

我有一个监督树,其中host_supervisor监视所有监视器,hostconnection_supervisor监视每个监视器。,都由应用程序主管监督,这意味着它们是监督树中的第一级子级。不过是下。connectionhost_agent_supervisoragenthost_supervisorconnection_supervisorhost_agent_supervisorconnection_supervisor

问题:

  1. 使用 host_id 和 host_agent_pid 对将地图存储到数据库中是个好主意吗?
  2. 如果 1. 为真,当出现问题并重新启动代理时,如何更新 host_agent_pid?
  3. 有没有更好的想法来实施这种情况?看来我的解决方案不遵循“erlang 方式”。
0 投票
1 回答
599 浏览

erlang - 为什么 simple_one_for_one 在调用 start_child 时不能指定不同的子 ID?

文档

请注意,当重启策略为 simple_one_for_one 时,子规范列表必须是只有一个子规范的列表。(忽略子规范标识符。)然后在初始化阶段不启动子进程,但假定所有子进程都使用 supervisor:start_child/2 动态启动。

零件的设计考虑是什么?它不会停止主动调用register(<chid_id>, ChildPid) 每个子进程。

0 投票
2 回答
152 浏览

erlang - 如何使用参数重新启动 Erlang 监督函数?

我正在学习 Erlang,并且有一个主管问题...

我有一个需要 3 个参数(字符串、字符串、数字)的函数。我想监督它并确保如果它失败,它会使用我传递的 3 个参数重新启动。

这是主管可以处理的事情,还是我需要研究其他概念?

谢谢。

2016 年 1 月 23 日更新

我想提一件事......我有一个包含 1439 个条目的列表。我需要为该列表中的每个条目创建一个主管。每个条目都会产生不同的参数。例如,这里有一些伪代码(让人想起 Ruby):

这是由运行时的用户交互触发的。output_pathand也是动态的table_name,但对于给定的批次不会改变。展开后,运行可能看起来像这样:

因此,如果 361 失败,我需要使用 、 和 重新"/output/2016-01-23/"启动temp1234361

这是我可以与主管一起做的事情吗?