【发布时间】: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