Cap’n Proto и обещание конвейеризации

Я хотел бы попробовать конвейерную обработку обещаний с помощью RPC Cap’n Proto C ++, но я не знаю, как это сделать.

Вот моя схема:

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

Вот что я хотел бы сделать (псевдокод):

increment(getInt());

Я пытался сделать что-то подобное:

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

но я не знаю, как реализовать getInt () и increment ().

1

Решение

Проблема здесь в том, что вы пытаетесь выполнить конвейеризацию для 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();

Вышеуказанная последовательность выполняется только с одной обратной связью по сети.

2

Другие решения

Других решений пока нет …