【问题标题】:Returning value from actor call从演员调用返回值
【发布时间】:2018-08-03 05:02:35
【问题描述】:

在 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 之外的演员 B 的结果,由于我是新手,因此将不胜感激。

演员 B 被另一个阻塞演员调用。

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 但我不只是返回 rp,而是使用它进行计算。所以使用阻塞actor是最好的解决方案。还是有其他方法?
    • 你不能用 promise 进行计算。从处理程序返回它只是一个占位符,因此 CAF 知道您稍后会产生结果(我稍微更新了答案:您不能只返回 string,它必须是 result&lt;string&gt;)。跨度>
    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2017-09-02
    • 2012-03-27
    相关资源
    最近更新 更多