Menu

[ru] Связь между дочерней кооперацией и агентом родительской

Help
2015-04-23
2015-04-23
  • Nicolay Shmakov

    Nicolay Shmakov - 2015-04-23

    Хотелось бы уточнить тонкости взаимодействия между родительскими и дочерними кооперациями.

    Например, есть агент a_parent, который на старте регистрирует дочернюю кооперацию:

    class parent : public so_5::rt::agent_t
    {
    public:
        virtual void so_define_agent() override
        {
    
            // Creation of child cooperation.
            auto coop = so_5::rt::create_child_coop( *this, "child_coop_name" );
    
            // Some actions with child coopearion.
    
            // Cooperation registration.
            so_environment().register_coop( std::move( coop ) );
        }   
    };
    

    Далее, если возникнет необходимость дерегистрировать дочернюю кооперацию, вызов будет подобным:

        so_environment().deregister_coop( "child_coop_name" );
    

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

    Поэтому есть ли возможность регистрировать дочерние кооперации без имени и сохранять их как-то в качестве атрибута у агента родительской кооперации. И можно ли агенту дерегистрировать все дочерние кооперации чем-нибудь вроде so_deregister_all_child_coops();

     
  • Yauheni Akhotnikau

    Получается, что агенту родительской кооперации необходимо сохранить имя созданной дочерней кооперации.

    Да, если дерегистрация инициируется родительской кооперацией, то нужно.

    Поэтому есть ли возможность регистрировать дочерние кооперации без имени и сохранять их как-то в качестве атрибута у агента родительской кооперации.

    Такой возможности нет. И какой смысл в этой возможности, если дочерние кооперации нужно дерегистрировать выборочно? Например, сначала создали 5 коопераций, потом решили дерегистрировать 1-ю, 3-ю и 5-ю. Ведь откуда-то мы узнаем, что нужно дерегистрировать именно эти кооперации. А раз так, значит можно сгенерировать имена коопераций.

    Например, если кооперации регистрируются для обработки запросов, обладающих уникальным идентификатором, можно генерировать имя дочерней кооперации из имени родительской кооперации и идентификатора запроса. Когда приходит время "убить" дочернюю кооперацию по идентификатору запроса имя кооперации генерируется еще раз и кооперация дерегистрируется.

    И можно ли агенту дерегистрировать все дочерние кооперации чем-нибудь вроде so_deregister_all_child_coops();

    Нет. Но можно создать промежуточную дочернюю кооперацию. А затем делать дочерние кооперации дочерней к ней:

    auto all_children = so_5::create_child_coop( *this, "all_children" );
    so_environment().register_coop( std::move( all_children ) );
    ...
    // Создание очередной дочерней кооперации.
    auto coop = so_environment().create_coop( "child_i" );
    coop->set_parent_coop_name( "all_children" );
    ...
    so_environment().register_coop( std::move( coop ) );
    ...
    // Уничтожение конкретной дочерней кооперации.
    so_environment().deregister_coop( "child_j" );
    ...
    // Уничтожение всех дочерних коопераций.
    so_environment().deregister_coop( "all_children" );
    

    Так же не нужно забывать, что агент из дочерней кооперации может инициировать собственную дерегистрацию. Т.е. агент-родитель отправляет агенту из дочерней кооперации какое-то сообщение. Дочерний агент в обработчике сообщения вызывает метод so_deregister_agent_coop_normally().

     

Log in to post a comment.