Apache Thrift外部事件循环

时间:2014-09-18 18:30:16

标签: c++ thrift event-loop

在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 个答案:

答案 0 :(得分:2)

据我所知,没有内置的方法可以使Apache Thrift与Boost.Asio或任何其他外部事件循环互操作。

确实可以编写自己的基于Asio的Thrift客户端/服务器。有一个正在进行的Apache Thrift JIRA任务(带有实验代码),他们正在努力:

THRIFT-579: Alternative ASIO based fully async client/server for C++

他们似乎需要有人来完成并维护替代的基于Asio的客户端/服务器。

以下是sample server program的摘录,其中显示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_portboost::asio::deadline_timer使用相同的boost::asio::io_service