Хотелось бы уточнить тонкости взаимодействия между родительскими и дочерними кооперациями.
Например, есть агент a_parent, который на старте регистрирует дочернюю кооперацию:
classparent:publicso_5::rt::agent_t{public:virtualvoidso_define_agent()override{// Creation of child cooperation.autocoop=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_deregister_all_child_coops();
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Получается, что агенту родительской кооперации необходимо сохранить имя созданной дочерней кооперации.
Да, если дерегистрация инициируется родительской кооперацией, то нужно.
Поэтому есть ли возможность регистрировать дочерние кооперации без имени и сохранять их как-то в качестве атрибута у агента родительской кооперации.
Такой возможности нет. И какой смысл в этой возможности, если дочерние кооперации нужно дерегистрировать выборочно? Например, сначала создали 5 коопераций, потом решили дерегистрировать 1-ю, 3-ю и 5-ю. Ведь откуда-то мы узнаем, что нужно дерегистрировать именно эти кооперации. А раз так, значит можно сгенерировать имена коопераций.
Например, если кооперации регистрируются для обработки запросов, обладающих уникальным идентификатором, можно генерировать имя дочерней кооперации из имени родительской кооперации и идентификатора запроса. Когда приходит время "убить" дочернюю кооперацию по идентификатору запроса имя кооперации генерируется еще раз и кооперация дерегистрируется.
И можно ли агенту дерегистрировать все дочерние кооперации чем-нибудь вроде so_deregister_all_child_coops();
Нет. Но можно создать промежуточную дочернюю кооперацию. А затем делать дочерние кооперации дочерней к ней:
autoall_children=so_5::create_child_coop(*this,"all_children");so_environment().register_coop(std::move(all_children));...// Создание очередной дочерней кооперации.autocoop=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().
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Хотелось бы уточнить тонкости взаимодействия между родительскими и дочерними кооперациями.
Например, есть агент a_parent, который на старте регистрирует дочернюю кооперацию:
Далее, если возникнет необходимость дерегистрировать дочернюю кооперацию, вызов будет подобным:
Получается, что агенту родительской кооперации необходимо сохранить имя созданной дочерней кооперации. Ситуация осложняется, если предполагается добавление нескольких таких агентов в родительскую кооперацию. Приходится каким-то образом конфигурировать имена регистрируемых дочерних коопераций.
Поэтому есть ли возможность регистрировать дочерние кооперации без имени и сохранять их как-то в качестве атрибута у агента родительской кооперации. И можно ли агенту дерегистрировать все дочерние кооперации чем-нибудь вроде so_deregister_all_child_coops();
Да, если дерегистрация инициируется родительской кооперацией, то нужно.
Такой возможности нет. И какой смысл в этой возможности, если дочерние кооперации нужно дерегистрировать выборочно? Например, сначала создали 5 коопераций, потом решили дерегистрировать 1-ю, 3-ю и 5-ю. Ведь откуда-то мы узнаем, что нужно дерегистрировать именно эти кооперации. А раз так, значит можно сгенерировать имена коопераций.
Например, если кооперации регистрируются для обработки запросов, обладающих уникальным идентификатором, можно генерировать имя дочерней кооперации из имени родительской кооперации и идентификатора запроса. Когда приходит время "убить" дочернюю кооперацию по идентификатору запроса имя кооперации генерируется еще раз и кооперация дерегистрируется.
Нет. Но можно создать промежуточную дочернюю кооперацию. А затем делать дочерние кооперации дочерней к ней:
Так же не нужно забывать, что агент из дочерней кооперации может инициировать собственную дерегистрацию. Т.е. агент-родитель отправляет агенту из дочерней кооперации какое-то сообщение. Дочерний агент в обработчике сообщения вызывает метод
so_deregister_agent_coop_normally()
.