Cap&x27;Proto和promise流水线 我想尝试用Copn原C++ RPC进行承诺流水线,但我不知道如何做。

Cap&x27;Proto和promise流水线 我想尝试用Copn原C++ RPC进行承诺流水线,但我不知道如何做。,c++,promise,rpc,pipelining,capnproto,C++,Promise,Rpc,Pipelining,Capnproto,这是我的模式: interface Test { getInt @0 () -> (intResult :Int32); increment @1 (intParam :Int32) -> (intResult :Int32); } 下面是我想做的(伪代码): 我试着这样做: auto request1 = test.getIntRequest(); auto promise = request1.send(); auto request2 = test.incremen

这是我的模式:

interface Test {
  getInt @0 () -> (intResult :Int32);
  increment @1 (intParam :Int32) -> (intResult :Int32);
}
下面是我想做的(伪代码):

我试着这样做:

auto request1 = test.getIntRequest();
auto promise = request1.send();

auto request2 = test.incrementRequest();
request2.setIntParam(promise.getIntResult()) // HERE IS THE PROBLEM
auto promise2 = request2.send();
但这不是使用承诺的好方法。 我希望你明白我想做什么

多谢各位

编辑:另一个问题:如何在服务器上实现这些方法

我编写了以下代码:

#include <kj/debug.h>
#include <capnp/ez-rpc.h>
#include <capnp/message.h>
#include <iostream>
#include "test.capnp.h"

using namespace std;


class TestI : virtual public Test::Server
{
public:
      TestI() {}
      ::kj::Promise<void> getInt(GetIntContext context) 
      {
            // ????
      }
      ::kj::Promise<void> increment(IncrementContext context) 
      {
            // ????
      }
};

class Int32BoxI : virtual public Int32Box::Server
{
private:
      int val = 12;
public:
      Int32BoxI(int value): val(value) {}
      ::kj::Promise<void> get(GetContext context)
      {
            context.getResults().setValue(this->val);
            return kj::READY_NOW;
      }
}
#包括
#包括
#包括
#包括
#包括“测试capnp.h”
使用名称空间std;
类TestI:虚拟公共测试::服务器
{
公众:
TestI(){}
::kj::承诺getInt(GetIntContext上下文)
{
// ????
}
::kj::承诺增量(增量上下文)
{
// ????
}
};
类Int32BoxI:虚拟公共Int32Box::服务器
{
私人:
int-val=12;
公众:
Int32BoxI(int值):val(值){}
::kj::承诺获取(GetContext上下文)
{
context.getResults().setValue(this->val);
现在返回kj::READY_;
}
}

但是我不知道如何实现getInt()和increment()。

这里的问题是,您试图在int上进行管道传输,但管道传输仅适用于对象引用。可以通过在对象中包装int来解决此问题,如下所示:

interface Int32Box {
  get @0 () -> (value :Int32);
}

interface Test {
  getInt @0 () -> (intResult :Int32Box);
  increment @1 (intParam :Int32Box) -> (intResult :Int32Box);
}
现在,您的代码将按编写的方式工作

当然,现在您必须在最后一个
Int32Box
上额外调用
.get()
,才能读取值。不过,幸运的是,您可以通过管道传输此呼叫,这样就不需要任何额外的网络往返

auto request1 = test.getIntRequest();
auto promise = request1.send();

auto request2 = test.incrementRequest();
request2.setIntParam(promise.getIntResult());
auto promise2 = request2.send();

auto request3 = promise2.getIntResult().getRequest();
auto promise3 = request3.send();

// This is the only wait!
int finalResult = promise3.wait().getValue();

上述序列仅在一次网络往返中执行。

谢谢您的回答。现在对我来说更清楚了。但是,在服务器上实现这些方法有一些困难。我编辑了我的第一篇文章,向你展示我的问题。再次感谢。@B.Clement我建议查看Cap'n Proto存储库中的“calculator”示例——它与您所做的非常相似。见:
auto request1 = test.getIntRequest();
auto promise = request1.send();

auto request2 = test.incrementRequest();
request2.setIntParam(promise.getIntResult());
auto promise2 = request2.send();

auto request3 = promise2.getIntResult().getRequest();
auto promise3 = request3.send();

// This is the only wait!
int finalResult = promise3.wait().getValue();