Возвращаемое значение из вызова актера

В C ++ Actor Framework у меня есть актер (предположим, A), который вызывает другого актора (давайте предположим, B), а затем значение B должно использоваться в логике A.

Чтобы сделать его более конкретным, код выглядит следующим образом:

behavior B(event_based_actor* self) {
return {
[=](const string& what) -> string {
return what;
}
};

behavior A(event_based_actor* self) {
return {
[=](const string& what, const actor& buddy) -> string {
self->request(buddy, std::chrono::seconds(10), what)
.then(
[=](string & data) {
aout(self) << data << endl;
}
what = data // here I have to use data and thats the issue
);
return what;
}
};

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

И актер B вызывается от другого блокирующего актера.

-1

Решение

Это не сработает. Актеры на основе событий неблокируют. Заявление request(x).then(f) посылает x другому актеру, а затем магазины f для обработки результата. Другими словами, request(...).then(...) всегда возвращается немедленно и f выполняется в более поздний момент времени. настройка what = data при этом ничего не добьется и ты всегда вернешь оригинал what,

То, что вы ищете, это ответные обещания. Они позволяют отложить ответ. В твоем случае:

behavior A(event_based_actor* self) {
return {
[=](const string& what, const actor& buddy) -> result<string> {
auto rp = self->make_response_promise();
self->request(buddy, std::chrono::seconds(10), what)
.then(
[=](string& data) mutable {
aout(self) << data << endl;
rp.deliver(std::move(data));
}
);
return rp;
}
};
}

Вы можете прочитать больше об обещаниях в руководство и есть также полный пример включены в CAF.

1

Другие решения

Других решений пока нет …