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

process - Trap_exit 的 Erlang 替代方案?

我想在我的 gen_server 停止时执行一些代码。我有我的 gen_server 陷阱出口(我添加process_flag(trap_exit, true)到 init 回调中)。这很有效,因为terminate/2总是在进程退出之前调用。我知道,由于我正在捕获崩溃的退出链接进程,因此不会使我创建的 gen_server 崩溃。我可以解决这个问题,但我想知道是否有替代方法process_flag(trap_exit, true)来实现这一目标?

我只想要一个“在进程退出之前”回调。还有其他类似的退出吗?

0 投票
1 回答
466 浏览

erlang - 启动和终止 simple_one_for_one 主管的孩子

我有一个简单的应用程序target_interceptor,它在收到注册和注销消息后,启动或终止simple_one_for_one rpc_server_supervisor.

主管代码rpc_server_supervisor

注册消息target_interceptor

注销消息target_interceptor

我的 Erlang 版本是:R15B01

第一个问题是在处理注册操作时,元组 {OK, Pid} = {error, <0.57.0>}; 尽管它表明出现问题,但 Pid 57 上的 gen_server rbmq_rpc_server 工作正常并响应消息。为什么start_child函数的返回值错误?什么地方出了错?

第二个问题是在处理注销操作时,即使我引用 Pid 而不是 ChildID,supervisor:terminate_child(Sup,Pid) 也会返回 {error,simple_one_for_one)。为什么会这样?我如何动态地单独终止主管的孩子?

编辑:两者target_interceptor都由rpc_server_supervisor主管rbmq_sup_sup监督:

编辑:在 target_interceptor init() 函数中调用 rpc_server_supervisor(这里是 rbmq_sup_sup 主管):

0 投票
1 回答
170 浏览

erlang - 我应该如何监督基于 Erlang mnesia 的 Web 应用程序?

在 Web 应用程序中,当多个用户可以访问 mnesia 表时,监督 Erlang mnesia 的最佳方法是什么?

例如,假设我有以下模块:

my_data_sup.erl -- 主管

my_insert_info.erl -- 插入表单

my_get_info.erl -- 检索表单

my_data_store.erl -- mnesia 查询函数

如果由于任何原因应该中止,我不明白如何重新启动 mnesia。

非常感谢,

LRP

0 投票
1 回答
1056 浏览

erlang - Erlang:如何处理长时间运行的初始化回调?

我有一个gen_server在启动时尝试在监督树中的主管下启动一定数量的子进程(通常是 10-20)。gen_server 的 init 回调supervisor:start_child/2为每个需要的子进程调用。调用supervisor:start_child/2是同步的,因此在子进程启动之前它不会返回。所有子进程也是 gen_servers,因此 start_link 调用在 init 回调返回之前不会返回。在 init 回调中,调用了第三方系统,这可能需要一段时间才能响应(当调用第三方系统在 60 秒后超时时,我发现了这个问题)。同时 init 调用被阻塞了,这意味着supervisor:start_child/2也被阻塞了。所以整个调用的 gen_server 进程supervisor:start_child/2没有反应。在等待 start_child 函数返回时调用 gen_server 超时。因为这很容易持续 60 秒或更长时间。我想更改此设置,因为我的应用程序在等待时处于半启动状态。

解决此问题的最佳方法是什么?

我能想到的唯一解决方案是将与第三方系统交互的代码从 init 回调中移出到 handle_cast 回调中。这将使初始化回调更快。缺点是我需要gen_server:cast/2在所有子进程启动后调用。

有没有更好的方法来做到这一点?

0 投票
2 回答
779 浏览

erlang-otp - 如何在 escript 中运行 Elixir Supervisor

我有一个尽可能简单的主管和 GenServer 的混合项目。当我从 iex 打电话时:

:mumble 调用引发异常,然后 GenServer 重新启动,第二个 :echo 调用正常。

如果我以任何其他方式运行代码,Supervisor 将无法重新启动 GenServer。例如,我使用主模块创建项目的 escript,如下所示:

:mumble 调用引发异常,并且 escript 终止,而 Supervisor 没有重新启动 GenServer。

我没有包含 Supervisor 和 Server 模块代码,因为它们在从 iex 调用时工作正常,所以我猜这里不需要它们。

我有概念上的误解吗?这是不可能的,还是我做错了什么?

0 投票
2 回答
211 浏览

erlang - 在 Erlang 的手卷主管中处理退出信号?

我正在尝试为我所做的流程编写主管。我已经对此进行了一段时间的调查,但无济于事,希望有人能提供帮助。

我对必须使用的接口有一定的限制,因为这是用于分配的,所以我知道使用列表的示例以及 Erlang 站点上更详细的 OTP 示例,但是这些都不合适。我提供了从我的应用程序中提取的示例来演示该问题。

我试图重新启动一个任意的工作人员,因为它没有正常的原因退出。工作进程很简单:

在主管中,我使用 ETS 选项卡来跟踪工人并重新启动他们,主管是这样的:

所以我相信我在这里做一些事情,my_mod 链接回主管,以便通知退出信号,主管设置了 trap_exit 以便主管有机会处理信号。但是我发现我只是得到一个 ** 异常退出:停止抛出,我不确定这是为什么?

我的测试用例如下:

谁能指出我正确的方向?

0 投票
1 回答
1186 浏览

erlang - Erlang 进程终止:它在哪里/何时发生?

考虑所有链接在树中的进程,可以是正式的监督树,也可以是一些临时结构。

现在,考虑一下这棵树下的某个孩子或工人,上面有一个父母或主管。我有两个问题。

  1. 如果它需要被杀死或关闭,我们希望“优雅地”退出这个过程,因为它可能会在更新某些帐户余额的过程中进行。假设我们已经正确地编写了一些终止函数,并通过适当的管道将此进程连接到其他进程。现在假设这个过程在它的主循环中工作。终止的信号进来了。这个终止发生在哪里(或者问题应该是何时)?换句话说,何时会调用终止?这个东西会在它正在运行的循环中间抢占自己并调用终止吗?它会等到循环结束但再次开始循环之前吗?它只会在接收模式下这样做吗?等等。

  2. 同样的问题,但没有终止功能已被编码。假设父进程是主管,并且该子进程遵循正常的 OTP 约定。父母告诉孩子关机,或者父母崩溃或其他什么。孩子处于其主循环中。何时/何地/如何发生关机?在主循环的中间?之后呢?等等。

0 投票
2 回答
527 浏览

erlang - Erlang 上的 Cowboy 在关机时崩溃

在关闭与我的牛仔处理程序相关的 Erlang vm 时,我遇到了很多错误。我有一个 simple_one_for_one 主管,它运行 start_listeners() 函数,该函数运行 cowboy:start_http()。

一切都开始了,没有错误,正常处理请求。

如果我关闭 erlang VM,我会得到:

[错误] 主管 bitter_rpc_sup 有子 bitter_rpc_http_id 在未定义退出时以 bitter_rpc_sup:start_listeners() 开始,原因在上下文 shutdown_error 中被杀死

还有一堆与牛仔进程相关的其他错误被杀死并异常终止。牛仔不遵循 OTP 约定关闭吗?有没有办法让我拦截主管的关闭并手动关闭所有牛仔进程/牧场池?

我应该在哪里尝试解决这个错误?

0 投票
1 回答
74 浏览

erlang - Erlang如何监督多模块

如何在一个主管中监督多个模块?

当我开始运行这个主管时,它告诉我:

我怎么解决这个问题?

0 投票
1 回答
173 浏览

erlang - Erlang - 主管和 gen_fsm 上的异常退出

我有 3 个模块calculadoralog_calculadorasupervisor_calculadora. Calculadora只是一个简单的计算器,它使用 gen_fsm 进行求和、减法、乘法和除法,supervisor 实现了supervisor 行为。Calculadora 运行良好,但是当我尝试使用主管时,calculadora当您进行除法 0/0 或异常时必须重新启动模块时,它不起作用。为什么?

PD:该模块log_calculadora只是将我在calculadoralog.txt 文件中所做的操作写入。TEST 模块是给我异常退出的模块。

计算器:

导师:

测试模块