gpt4 book ai didi

erlang - 如何在动态主管中自动删除终止子项的规范

转载 作者:行者123 更新时间:2023-12-04 06:32:00 25 4
gpt4 key购买 nike

这个问题不需要 USB 知识,只是描述它以使示例更加具体。

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

对于每个设备,我的主管都需要一个动态的 child 。

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

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

我打算打电话supervisor:which_children/1在每次扫描之前找出哪些设备存在但没有子进程运行。

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

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

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

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

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

不知怎的,这一切让我觉得不雅,所以我问自己(和你):

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

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

最佳答案

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

关于erlang - 如何在动态主管中自动删除终止子项的规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5285690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com