在C ++ Actor框架中,我有一个actor(假设A)调用另一个actor(假设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;
}
};
从代码中可以看出,我必须使用数据变量,这是lambda之外的actor B的结果,因为我对此有了新的帮助,我们将不胜感激。
演员B被另一个封锁演员调用。
答案 0 :(得分:1)
这不起作用。基于事件的参与者是非阻塞的。语句request(x).then(f)
将x
发送给另一个actor,然后存储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;
}
};
}