Внешний цикл событий Apache Thrift

В C ++, как я могу заставить сервер Apache Thrift обрабатывать внешние события? Я хотел бы написать свой собственный цикл событий и вручную запускать ожидающие события Thrift без блокировки.

Я хотел бы иметь возможность сделать что-то вроде этого:

//...
TSimpleServer server(processor,
serverTransport,
transportFactory,
protocolFactory);

boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.async_wait(&onTimer);

while (!finished)
{
server.poll();
io.poll();
}

В приведенном выше цикле while я понимаю, что при отсутствии ожидающих событий будет много расточительного ожидания. Любые предложения о том, как этого избежать?

4

Решение

Насколько я могу судить, нет встроенного способа заставить Apache Thrift взаимодействовать с Boost.Asio или любым другим внешним циклом событий.

Действительно возможно написать свой собственный клиент-сервер Thrift на базе Asio. Существует текущая задача Apache Thrift JIRA (с экспериментальным кодом), в которой они работают над такими:

THRIFT-579: альтернативный полностью асинхронный клиент / сервер на основе ASIO для C ++

Похоже, что им нужен кто-то для завершения и поддержки альтернативного клиента / сервера на основе Asio.

Вот фрагмент из их пример серверной программы который показывает, как TAsioServer может быть передан в boost::asio::io_service,

int main(int argc, char **argv) {
boost::asio::io_service io_service;

boost::shared_ptr<protocol::TProtocolFactory> protocolFactory(new protocol::TBinaryProtocolFactory());
boost::shared_ptr<CalculatorAsyncHandler> handler(new CalculatorAsyncHandler(io_service));
boost::shared_ptr<TProcessor> processor(new CalculatorAsyncProcessor(handler));

boost::shared_ptr<apache::thrift::async::TAsioServer> server(
new apache::thrift::async::TAsioServer(
io_service,
9090,
protocolFactory,
protocolFactory,
processor));

server->start(); // Nonblocking
io_service.run(); // Blocking

return 0;
}

Используя их TAsioServerнужно уметь, например, boost::asio::serial_port а также boost::asio::deadline_timer использовать то же самое boost::asio::io_service,

2

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector