Я знаю, что актеры могут быть реализованы по функциям. Следующий фрагмент кода взят из примеров CAF github /hello_world.cpp.
Я знаю первый метод реализации, который связывает пару обработчиков сообщений с актером. Актер будет жив на заднем плане и будет вызван событиями, а затем завершится, когда self->quit
называется.
Но второй ничего не возвращает, где его обработчик сообщений? И, похоже, нет self->quit
-подобная функция, чтобы завершить себя. Это живой, когда hello_world возвращается? Или он просто завершается после завершения ответа в then
?
behavior mirror(event_based_actor* self) {
return {
[=](const string& what) { ... }
[=](int) { ...}
}
};
void hello_world(event_based_actor* self, const actor& buddy) {
self->sync_send(...).then(
...
);
}
int main() {
auto mirror_actor = spawn(mirror);
spawn(hello_world, mirror_actor);
await_all_actors_done();
shutdown();
}
Обновлено,
Актер завершит свою работу, если в его стеке поведения нет обработчиков сообщений.
Четное hello_word
ничего не возвращает как поведение слушателя актера. Актер все еще жив, когда функция возвращается. Поскольку sync_send
добавил then-behavior
в стеке, чтобы подготовить ответ от зеркала. После одного выстрела then-behavior
появляется, чтобы закончить ответ, стек пуст, тогда актер вправе завершить сам.
Но второй ничего не возвращает, где его обработчик сообщений? И, похоже, нет
self->quit
-подобная функция, чтобы завершить себя. Жив ли когдаhello_world
возвращается? Или это просто завершиться после того, как закончил ответ в то время?
Так как функция hello_world
возвращает недействительным, а не behavior
, субъект, выполняющий эту функцию, автоматически завершает работу, как только достигает конца функции. Этот актер выполняет три действия после появления:
sync_send
,Других решений пока нет …