从演员电话

时间:2018-02-23 07:02:13

标签: c++ actor c++-actor-framework

在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被另一个封锁演员调用。

1 个答案:

答案 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;
    }
  };
}

您可以在manual中详细了解承诺,还可以在CAF中找到完整的example