Elixir DynamicSupervisor按名称获取孩子

时间:2018-08-17 12:49:26

标签: elixir otp

import React from 'react'; import classnames from 'classnames/bind'; import styles from './NoDataComponent.css'; const cx = classnames.bind(styles); export const NoDataComponent: React.SFC = props => { const { children } = props; return ( <div className={cx('rt-noData', 'error')}>{children}</div> // one can insert 'error' class based on what children has but that's hacky ); }; 模块中,我们有一个名为DynamicSupervisor的函数,该函数注册一个孩子并启动它。我的问题是:以后如何才能按名称找到特定的子进程,因为例如start_child函数仅将atom作为参数,而我不想使用atom来命名子进程,因此我将它们命名为元组,例如< / p>

2 个答案:

答案 0 :(得分:0)

没有通用解决方案AFAIK。您可以通过两种方法进行管理。

如果您DynamicSupervisor的所有子代都是不同的模块,请使用DynamicSupervisor.which_children/1列出子代,并根据模块名称对最后一个参数进行模式匹配。

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

答案 1 :(得分:0)

您可以使用Registry module and the :via tuple

在上面的示例中,您可以将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"),但是它可以是任何长生不老药术语,例如元组。