Cap' n Proto并承诺流水线

时间:2017-01-18 14:29:11

标签: c++ promise rpc pipelining capnproto

我想尝试使用Cap&n Proto C ++ RPC进行流水线操作,但我不知道该怎么做。

这是我的架构:

# What are you trying to do here? This is an unsaved aircraft instance
aircraft = Aircraft(aircraft.pk)
return aircraft

这是我想做的(伪代码):

interface Test {
  getInt @0 () -> (intResult :Int32);
  increment @1 (intParam :Int32) -> (intResult :Int32);
}

我试着这样做:

increment(getInt());

但这不是使用promises的好方法。 我希望你明白我想做什么。

谢谢。

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

我写了这段代码:

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

auto request2 = test.incrementRequest();
request2.setIntParam(promise.getIntResult()) // HERE IS THE PROBLEM
auto promise2 = request2.send();

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

1 个答案:

答案 0 :(得分:2)

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

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

interface Test {
  getInt @0 () -> (intResult :Int32Box);
  increment @1 (intParam :Int32Box) -> (intResult :Int32Box);
}

现在您的代码将按照书面形式运行。

当然,现在您必须在最终.get()上另外调用Int32Box才能读取该值。幸运的是,你可以管理这个电话,因此它不需要任何额外的网络往返。

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();

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