在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循环中,我意识到如果没有未决事件,将会有很多浪费的忙等待。关于如何避免这种情况的任何建议?
答案 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_port
和boost::asio::deadline_timer
使用相同的boost::asio::io_service
。