如何在咖啡馆找到演员

How to find an actor in caf

我开始玩弄 caf 并用它来表示图形。
由于此图是单向的,我可以创建我需要的演员并相应地 link 它们,但现在我想找到一个由其名称标识的特定演员。

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})
}

如果是这样,开销会不会很大,因为必须检查所有节点是否与消息匹配?
或者还有其他我在文档中没有找到的方法吗?

我认为这个小组是个好主意,因为它也可以分布式工作。您可以通过向群组宣布每个生成的 actor 而不是广播消息来获得更好的可扩展性。

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

如果您有很多 actor 需要名称映射并且您不想多次复制映射,您也可以使用单个 actor 而不是存储映射并可以查询的组由其他人在需要解析名称时使用。

您的第三个选择是使用演员注册表,但这仅在本地有效,并且仅当您可以使用 atom 名称时。如果这与您的用例相匹配,那么您可以通过 detail::singletons::get_actor_registry()->put_named(key, value); 注册新参与者并通过 detail::singletons::get_actor_registry()->get_named(key); 检索它们。我通常不推荐来自 detail 命名空间的功能,但这个特定功能将在 0.15 中进入 public API。顺便说一下,你可以动态创建一个atom_value,但是你当然被限制在10个字符以内并且只允许使用字母数字字符。

希望对您有所帮助。