在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
并维护自己的备用注册表来查找子级。