如何在咖啡馆找到演员
How to find an actor in caf
我开始玩caf,并用它来表示图形
由于这个图是单向的,我可以创建我需要的参与者,并相应地将它们链接起来,但现在我想找到一个由其名称标识的特定参与者。
class node_actor : public event_based_actor{
std::string m_name;
...
};
int main(){
auto entry_actor = spawn<node_actor>();
// node_actor will spawn other actors with names
// like this: node_actor will spawn node1
// node1 will spwan node2
// node2 will spwan node3 and so on
// now I want to send a message to node2
scoped_actor self;
self->send(n2, 42});
...
}
找到n2
的最佳方法是什么
这可以由一个广播消息的小组来处理吗?例如:
{
auto g = group::get("local", "Node events");
auto entry_actor = spawn_in_group<node_actor>(g);
// change all nodes to call spawn_in_group
scoped_actor self;
self->send(g, name, 42})
}
如果是这样的话,这不会有太多开销吗?因为必须检查所有节点是否与消息匹配
或者还有其他我还没有在文档中找到的方法吗?
我认为这个组是个好主意,因为它也可以分布式工作。您可以通过向组宣布每个派生的参与者而不是广播消息来获得更好的可伸缩性。
然后,每个需要name <-> actor
映射的参与者都会订阅该组(在实际生成节点之前)。每当生成一个新节点时,都会将其名称及其句柄发送到组,每个侦听器都会将此映射添加到其本地状态(如果只对少数选定名称感兴趣,则忽略该消息)。
如果您有很多参与者需要名称映射,并且您不想多次复制映射,那么您也可以使用单个参与者,而不是存储映射的组,其他人可以在需要解析名称时查询该组。
您的第三种选择是使用actor注册表,但这只能在本地工作,并且只有在您可以使用atom
名称的情况下才能工作。如果这与您的用例相匹配,那么您可以通过detail::singletons::get_actor_registry()->put_named(key, value);
注册新参与者,并通过detail::singletons::get_actor_registry()->get_named(key);
检索它们。我通常不推荐来自detail
名称空间的功能,但这个特定的功能将在0.15中进入公共API。顺便说一句,您可以动态创建一个atom_value
,但您当然只能使用10个字符,并且只能使用字母数字字符。
希望能有所帮助。