【问题标题】:How to atomatically delete specs of terminated children in a dynamic supervisor如何在动态主管中自动删除已终止子项的规范
【发布时间】:2011-07-14 05:30:27
【问题描述】:

这个问题不需要USB知识,只是描述它是为了让例子更具体。

我正在尝试为 USB 总线上的特定设备实现动态管理器。 这些设备具有地址,并在系统的生命周期内出现和消失。

对于每台设备,我都需要一个动态的孩子作为我的主管。

这些孩子是暂时的,所以一旦它们崩溃或终止,我们就不会重新启动它们(因为那时它们可能已经消失了)。

我有一个进程在特定时间扫描 USB 端口并生成我要处理的 USB 设备的所有地址的列表。

我计划在每次扫描之前致电supervisor:which_children/1,以了解哪些设备存在但没有运行子进程。

为了找出哪些地址有孩子在运行,我计划为包含地址的子规范创建 Id 原子(只有几个地址可能),例如adr_12 如果孩子处理地址12

当我尝试启动/重新启动丢失的孩子时,我遇到了一个有点丑陋的情况,即当临时孩子终止或崩溃时,孩子规范不会自动删除(至少我认为是这样)。所以我需要这样的代码:

case supervisor:start_child(my_sup, Spec) of
    {error, already_present} ->
        supervisor:restart_child(my_sup, Spec);
    Any -> Any
end

然后就是不知道supervisor:which_children/1是否也返回已经终止的孩子的问题。

因此,最好在子节点暂时终止后将其删除。

不知何故,这一切对我来说都是不雅的,所以我问自己(和你):

我怎样才能最优雅地解决这个问题?

在这种情况下最好不要使用主管吗?

【问题讨论】:

    标签: erlang erlang-otp erlang-supervisor


    【解决方案1】:

    在我看来,您想要动态添加到主管的孩子彼此非常相似。也许你需要一个simple-one-for-one 主管。这些主管是“one_for_one 主管的简化版本,其中所有子进程都是同一进程的动态添加实例。”。每个孩子都有相同的孩子规格,因此您在调用supervisor:add_child/2时无需指定它。

    另外,请注意,上述动态创建原子(例如adr_12)的想法可能很危险。原子在 Erlang 系统中是有限的(默认为 ~1000000)。有关详细信息,请参阅文档。

    【讨论】:

    • USB 总线上只有 127 个可能的地址,只有低地址被使用过 -> 所以创建原子不是问题
    • 当然。我只是认为提及这个问题很有用 - 有人可能会看到这个问题并认为对更多的孩子使用相同的方法 -
    • 请参阅我对@IGCA 回答的评论
    【解决方案2】:

    我的直觉/下意识的反应是:“你需要为他们使用 simple_one_for_one”主管,所以他们的规范在停止时会被删除。如果您需要能够获取特定的通信进程,我会为此使用 gproc 应用程序(或 ETS 表)。

    【讨论】:

    • simple_one_for_one 的问题是要找出缺少进程的地址并不容易。我必须实现一个单独的地址注册表来监视进程。那么 simple_one_for_one 主管的作用是什么?
    • gproc 听起来确实对这个 BTW 很有吸引力
    • simple_one_for_one 主管用于挂接进程,因此如果其他进程死亡,您可以正常关闭 USB 链接。这是为了清理,没有别的。
    • 我明白了。但这不是我关心的问题:对于由孩子处理的每个 USB 设备,都会启动一组完整的链接进程。如果这里出现严重问题,孩子将被终止并重新启动。另外发生的事情是插入了新设备,有时设备会消失并重新出现(非常快)。我正在尝试一个普通的 one_for_one 主管,其中添加了一个通过扫描过程删除的孩子(消失和重新出现通常在同一个地址,并且可以由主管自动处理)
    • 顺便说一句:为了启动正确的 USB 处理程序,不需要地址来获取通信进程(地址由操作系统即时给出,与任何有用的东西无关)。一旦我与他们交谈,我已经有一个由设备序列号驱动的单独注册表。
    猜你喜欢
    • 2016-06-24
    • 2014-12-09
    • 1970-01-01
    • 2014-11-21
    • 2011-07-26
    • 2016-04-10
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多