长生不老药动态主管 按名字得到孩子



DynamicSupervisor模块中,我们有一个名为start_child的函数,它注册一个孩子并启动它。我的问题是:以后我如何通过名称找到该特定子进程,因为例如Process.whereis函数仅将原子作为参数,而我不想用原子命名子进程,例如将它们命名为元组

您可以使用注册表模块和 :via 元组来执行此操作

在上面的示例中,您可以将Agent替换为子模块。

{:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest)
name = {:via, Registry, {Registry.ViaTest, "my_child_name"}}
{:ok, _} = Agent.start_link(fn -> 0 end, name: name)
Agent.get(name, & &1)
#=> 0
Agent.update(name, &(&1 + 1))
Agent.get(name, & &1)
#=> 1
Registry.lookup(Registry.ViaTest, "my_child_name")
#=> [{self(), nil}]

这个例子使用一个字符串作为键("my_child_name"(,但它可以是任何长生不老药术语,如元组。

没有通用的解决方案 AFAIK。您有两种选择来管理它。

如果DynamicSupervisor的所有子模块都是不同的模块,请使用DynamicSupervisor.which_children/1列出子模块,模式将最后一个参数与模块名称匹配。

否则,您应该使用元组命名:via并维护自己的备用注册表来查找子级。

最新更新