Внешний цикл событий 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
,