Я хочу использовать system.registry () в кафе-0.15.7 чтобы сделать актеров доступными по всей системе по имени, когда я назначаю двух актеров по имени, вызывая put (atom_value, actor), мой прогресс не будет прекращаться автоматически, и он остановится, пока я не убью его.
Однако, когда я добавлю erase () явно, он выйдет.
На самом деле, как руководство CAF раздел 8 сказал:
Актеры удаляются автоматически, когда они прекращаются.
И это то, что я хочу. Так что мне интересно, это ошибка или нет.
Для воспроизведения моих результатов, пожалуйста, запустите следующий код C ++:
#include <string>
#include <iostream>
#include "caf/all.hpp"#include "caf/io/all.hpp"
using std::endl;
using std::string;
using namespace caf;
atom_value world_atom = atom("world_act");
atom_value hello_atom = atom("hello_act");
behavior world(event_based_actor *self) {
return behavior {
[=](const string &what) {
aout(self) << "Message: " << what << endl;
return std::string{"World"};
}
};
}
void hello(event_based_actor* self) {
string out_msg{"Hello "};
auto tmp = self->home_system().registry().get(world_atom);
auto buddy = actor_cast<actor>(tmp);
self->request(actor_cast<actor>(tmp), std::chrono::seconds(2), out_msg).then(
[=] (const string& what) {
aout(self) << "Message: " << what << endl;
});
}
int main() {
actor_system_config cfg;
actor_system system{cfg};
auto world_actor = system.spawn(world);
system.registry().put(world_atom, world_actor);
auto hello_actor = system.spawn(hello);
system.registry().put(hello_atom, hello_actor);
std::cout << "current running: " << system.registry().running() << endl;
/* Uncomment the following three lines if you want to stop automatically */
// getchar();
// system.registry().erase(hello_atom);
// system.registry().erase(world_atom);
return 0;
}
Ваш процесс не прекратится, потому что система акторов CAF ждет всех участников, прежде чем завершить работу. Обычное приложение CAF использует main
только раскрутить актеров.
Актеры удаляются автоматически, когда они прекращаются.
И это то, что я хочу.
В тот момент, когда вы удаляете своих актеров из реестра в вашем примере, они становятся недоступными и в результате прекращают работу. Как только все ваши актеры заканчиваются, система актеров отключается. Тем не менее, ваш фрагмент никогда не завершает world
актер явно, то есть он никогда не вызывает self->quit()
, Вы можете заставить это через anon_send_exit(world_actor, exit_reason::user_shutdown)
, Завершение его также удалит его из реестра, как указано в руководстве.
Других решений пока нет …