问题标签 [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.
process - Trap_exit 的 Erlang 替代方案?
我想在我的 gen_server 停止时执行一些代码。我有我的 gen_server 陷阱出口(我添加process_flag(trap_exit, true)
到 init 回调中)。这很有效,因为terminate/2
总是在进程退出之前调用。我知道,由于我正在捕获崩溃的退出链接进程,因此不会使我创建的 gen_server 崩溃。我可以解决这个问题,但我想知道是否有替代方法process_flag(trap_exit, true)
来实现这一目标?
我只想要一个“在进程退出之前”回调。还有其他类似的退出吗?
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 主管):
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
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
在所有子进程启动后调用。
有没有更好的方法来做到这一点?
erlang-otp - 如何在 escript 中运行 Elixir Supervisor
我有一个尽可能简单的主管和 GenServer 的混合项目。当我从 iex 打电话时:
:mumble 调用引发异常,然后 GenServer 重新启动,第二个 :echo 调用正常。
如果我以任何其他方式运行代码,Supervisor 将无法重新启动 GenServer。例如,我使用主模块创建项目的 escript,如下所示:
:mumble 调用引发异常,并且 escript 终止,而 Supervisor 没有重新启动 GenServer。
我没有包含 Supervisor 和 Server 模块代码,因为它们在从 iex 调用时工作正常,所以我猜这里不需要它们。
我有概念上的误解吗?这是不可能的,还是我做错了什么?
erlang - 在 Erlang 的手卷主管中处理退出信号?
我正在尝试为我所做的流程编写主管。我已经对此进行了一段时间的调查,但无济于事,希望有人能提供帮助。
我对必须使用的接口有一定的限制,因为这是用于分配的,所以我知道使用列表的示例以及 Erlang 站点上更详细的 OTP 示例,但是这些都不合适。我提供了从我的应用程序中提取的示例来演示该问题。
我试图重新启动一个任意的工作人员,因为它没有正常的原因退出。工作进程很简单:
在主管中,我使用 ETS 选项卡来跟踪工人并重新启动他们,主管是这样的:
所以我相信我在这里做一些事情,my_mod 链接回主管,以便通知退出信号,主管设置了 trap_exit 以便主管有机会处理信号。但是我发现我只是得到一个 ** 异常退出:停止抛出,我不确定这是为什么?
我的测试用例如下:
谁能指出我正确的方向?
erlang - Erlang 进程终止:它在哪里/何时发生?
考虑所有链接在树中的进程,可以是正式的监督树,也可以是一些临时结构。
现在,考虑一下这棵树下的某个孩子或工人,上面有一个父母或主管。我有两个问题。
如果它需要被杀死或关闭,我们希望“优雅地”退出这个过程,因为它可能会在更新某些帐户余额的过程中进行。假设我们已经正确地编写了一些终止函数,并通过适当的管道将此进程连接到其他进程。现在假设这个过程在它的主循环中工作。终止的信号进来了。这个终止发生在哪里(或者问题应该是何时)?换句话说,何时会调用终止?这个东西会在它正在运行的循环中间抢占自己并调用终止吗?它会等到循环结束但再次开始循环之前吗?它只会在接收模式下这样做吗?等等。
同样的问题,但没有终止功能已被编码。假设父进程是主管,并且该子进程遵循正常的 OTP 约定。父母告诉孩子关机,或者父母崩溃或其他什么。孩子处于其主循环中。何时/何地/如何发生关机?在主循环的中间?之后呢?等等。
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 约定关闭吗?有没有办法让我拦截主管的关闭并手动关闭所有牛仔进程/牧场池?
我应该在哪里尝试解决这个错误?
erlang - Erlang如何监督多模块
如何在一个主管中监督多个模块?
当我开始运行这个主管时,它告诉我:
我怎么解决这个问题?
erlang - Erlang - 主管和 gen_fsm 上的异常退出
我有 3 个模块calculadora
:log_calculadora
和supervisor_calculadora
. Calculadora
只是一个简单的计算器,它使用 gen_fsm 进行求和、减法、乘法和除法,supervisor 实现了supervisor 行为。Calculadora 运行良好,但是当我尝试使用主管时,calculadora
当您进行除法 0/0 或异常时必须重新启动模块时,它不起作用。为什么?
PD:该模块log_calculadora
只是将我在calculadora
log.txt 文件中所做的操作写入。TEST 模块是给我异常退出的模块。