来自Actor Call的返回价值

Returning value from actor call

本文关键字:返回 Actor Call 来自      更新时间:2023-10-16

在C Actor框架中,我有一个演员(假设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;
    }
};

可以看到代码中我必须使用数据变量,这是lambda之外的Actor B的结果,并且由于我是新手的任何帮助,都将不胜感激。

,演员B是从另一个阻止演员中调用的。

这是行不通的。基于事件的演员是无障碍的。语句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中还包含一个完整示例。