我有创建其他主管的根主管: 通用标签

我有gen_server-监听器。创建超级用户后,如何使用popd_listener_sup超级用户运行此gen_server?

谢谢。

有帮助吗?

解决方案

根主管 通用标签

如果子进程是另一个主管,则应将子规范中的Shutdown设置为infinity,以给子树足够的时间来关闭,并将Type设置为supervisor,这就是我们要做的。

儿童主管 通用标签

在这里,在子规范中,我们将Shutdown的值设置为2000。超时值是整数,表示主管将通过调用exit(Child,shutdown)告诉子进程终止,然后等待退出信号,并从子进程中返回原因关机。

监听器 通用标签

从Erlang / OTP文档中:

如果gen_server是服务器的一部分 监督树,并由其命令 主管终止,功能 Module:terminate(Reason, State)将 如果使用Reason=shutdown来调用 适用以下条件:

  • gen_server已设置为捕获出口信号,并且
  • 主管的子规范中定义的关闭策略
    是整数超时值,不是
    残酷的杀戮。

    这就是为什么我们在erlang:process_flag(trap_exit, true)中称Module:init(Args)

    样品运行

    启动根主管: 通用标签

    根主管运行并自动启动其子进程,在本例中为子主管。子级主管继而启动其子级进程;在我们的案例中,我们只有一个孩子,ch1

    我们让ch1评估正常代码: 通用标签

    现在有一些错误的代码: 通用标签

    您可能会看到子进程ch1已由子级主管popd_listener_sup(注意ch1 has started (<0.39.0>))重新启动。

    由于我们的外壳程序和根管理器是双向链接的(在根管理器函数supervisor:start_link中调用supervisor:start,而不是start_link/0),因此exit(normal)导致根管理器关闭,但其子进程仍有一段时间需要清理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top