Я начал играть с кафе и использовать его для представления графика.
Поскольку этот график не является однонаправленным, я могу создавать нужные мне актеры и связывать их соответственно, но теперь я хочу найти конкретного актера, идентифицируемого по его имени.
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
Затем отображение будет подписываться на группу (до того, как вы на самом деле породите свои узлы). Всякий раз, когда вы создаете новый узел, вы отправляете его имя вместе с его дескриптором группе, и каждый слушатель добавляет это отображение в свое локальное состояние (или игнорирует сообщение, если его интересуют только несколько выбранных имен).
Если у вас много актеров, которым требуется сопоставление имен, и вы не хотите многократно повторять сопоставление, вы также можете использовать один актер вместо группы, которая хранит карту и может запрашиваться другими, когда им нужно. разрешить имя.
Ваш третий вариант — использовать реестр актеров, но это будет работать только локально и только если вы можете использовать atom
имена. Если это соответствует вашему варианту использования, вы можете зарегистрировать новых актеров через detail::singletons::get_actor_registry()->put_named(key, value);
и получить их через detail::singletons::get_actor_registry()->get_named(key);
, Я обычно не рекомендую функции из detail
пространство имен, но эта особенность появится в общедоступном API в версии 0.15. Кстати, вы можете создать atom_value
динамически, но вы, конечно, ограничены 10 символами и можете использовать только буквенно-цифровые символы.
Надеюсь, это поможет.
Других решений пока нет …