2016-04-10 3 views
2

Я начал играть с кафе и использовать его для представления графика.
Поскольку этот график является однонаправленным, я могу создать актеров, которые мне нужны, и связать их соответственно, но теперь я хочу найти определенного актера, идентифицированного его именем.Как найти актера в кафе

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

0 Что было бы лучше всего подходит для поиска? 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}) 
} 

Если так не было бы много накладных расходов, поскольку все узлы должны быть проверены, если они совпадают сообщение?
Или есть другие способы, которых я еще не нашел в документах?

ответ

2

Я думаю, что эта группа - хорошая идея, потому что она также работает. У вас может быть более высокая масштабируемость, объявляя каждого игрока, возникшего в группе, вместо трансляции сообщений.

Каждый актер, которому требуется сопоставление 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 символами и им разрешено использовать буквенно-цифровые символы.

Надеюсь, что это поможет.

+0

Спасибо, я попробую. Еще одна вещь, поскольку я не нашел ее в документах. Могу ли я использовать параметр второй группы для разделения моих групп. Например, 'group :: get (" local "," EvenNodes ")' и 'group :: get (" local "," OddNodes ")', чтобы сделать два узловых пространства? – mkaes

+0

Да, вторым параметром является любой пользовательский идентификатор (строка). Вы можете создать столько групп, сколько захотите. – neverlord

+0

Как насчет 'ConfigServ' и государственных участников с членом' name'? – mavam

Смежные вопросы