C++ 如何在咖啡馆找到演员

C++ 如何在咖啡馆找到演员,c++,c++-actor-framework,C++,C++ Actor Framework,我开始玩弄caf,并用它来表示图形。 因为这个图是单向的,所以我可以创建我需要的参与者并相应地链接它们,但是现在我想找到一个由它的名称标识的特定参与者 class node_actor : public event_based_actor{ std::string m_name; ... }; int main(){ auto entry_actor = spawn<node_actor>(); // node_actor will spawn ot

我开始玩弄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});
    ...
}
如果是这样,那不是会有很大的开销,因为必须检查所有节点是否与消息匹配?

或者还有其他我在文档中没有找到的方法吗?

我认为小组是个好主意,因为它也可以分布式工作。通过向组中宣布每个衍生的参与者,而不是广播消息,您可以获得更好的可伸缩性

然后,需要
名称actor
映射的每个actor将订阅该组(在您实际生成节点之前)。每当生成新节点时,都会将其名称及其句柄发送给组,并且每个侦听器都会将此映射添加到其本地状态(如果它只对几个选定的名称感兴趣,则忽略该消息)

如果您有许多参与者需要名称映射,并且不想多次复制映射,那么您也可以使用单个参与者,而不是存储映射的组,其他人可以在需要解析名称时查询这些参与者

您的第三个选项是使用actor注册表,但这只在本地工作,并且只有在您可以使用
atom
名称的情况下才能工作。如果这与您的用例相匹配,那么您可以通过
detail::singleton::get\u actor\u registry()->put\u named(key,value)注册新的actor并通过
detail::singleton::get_actor_registry()->get_named(key)检索它们。我通常不推荐使用
detail
名称空间中的特性,但这一特性将在0.15中应用到公共API中。顺便说一下,您可以动态创建一个
atom\u值
,但您当然只能使用10个字符,并且只能使用字母数字字符


希望能有所帮助。

谢谢,我会试试的。还有一件事,因为我在文档中没有找到它。我可以使用第二个group参数来划分我的组吗。例如
group::get(“local”、“EvenNodes”)
group::get(“local”、“OddNodes”)
来创建两个节点空间?是的,第二个参数是任何用户定义的标识符(字符串)。您可以创建任意数量的组。那么
ConfigServ
和具有
name
成员的基于状态的参与者呢?@mavam
ConfigServ
只是一个节点本地键值存储。在这种情况下,在注册表上使用它没有任何好处。CAF对参与者的
名称
进行评估时,除了日志记录外,不会对任何内容进行评估。是否可以为每个参与者使用一个组?这样,您就不需要使用详细名称空间,也不需要本地数组/映射来访问。这甚至会起作用。。。。还是我错了?
{
    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})
}