Внешний цикл событий 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 я понимаю, что при отсутствии ожидающих событий будет много расточительного ожидания. Любые предложения о том, как этого избежать?

1 ответ

Насколько я могу судить, нет встроенного способа заставить 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,

Другие вопросы по тегам