标签:let thrift 线程池 ror 列表 客户 server 区别 接收
一、thrift 共有5中工作模式,分成阻塞和非阻塞:
阻塞:TSimpleServer、TThreadPoolServer
非阻塞:TNonblockingServer、THsHaServer、TThreadedSelectorServer
这里的阻塞是指,如果同时有多个新链接到来,但一次只能处理一个新连接,即当前的链接会阻塞后续链接的处理。
非阻塞则是,当有许多新连接到来时,会同时获得这些链接的列表,一次性处理一批链接。
二者的区别在加上线程池的时候就显现出来了,阻塞模式一次只能往池子里扔一个链接,而非阻塞一次可以扔一堆链接。
但池子本身大小是优先的,所以一般高并发场景并不适合用线程池模式。
具体的工作模式参考:https://blog.csdn.net/houjixin/article/details/42779915
二、线程池模式代码:
作为服务端,应该能够同时接收多个客户端传来的数据,所以服务端应该实现多线程机制。
按以下3个步骤改写服务端(Serv_server.skeleton.cpp)即可实现多线程。
(1)采用线程池的main函数的代码如下:
int main(int argc, char **argv) {
// thread pool
shared_ptr<ServHandler> handler(new
ServHandler());
shared_ptr<TProcessor> processor(new ServProcessor(handler));
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TServerTransport> serverTransport(new TServerSocket(9090));
// 指定15个线程
shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(15);
shared_ptr<PosixThreadFactory> threadFactory
= shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
printf("start.../n");
TThreadPoolServer server(processor,
serverTransport,
transportFactory,
protocolFactory,
threadManager);
server.serve();
printf("end/n");
return 0;
}
注意代码中的红色关键字,要将他们修改成你自己的service中定义的名字。
(2)头文件:
#include <concurrency/ThreadManager.h>
#include <concurrency/PosixThreadFactory.h>
#include <server/TThreadPoolServer.h>
#include <server/TThreadedServer.h>
能加的都加上吧,以免出现类似如下错误:
error: ‘ThreadManager’ was not declared in this scope
(3)命名空间:using namespace ::apache::thrift::concurrency;
否则出现错误:error: ‘PosixThreadFactory’ was not declared in this scope
concurrency是和#include中的文件目录是对应的
每一个客户端连接时,服务端都将启动一个线程为其服务,数据传输结束后,服务端回收这个线程。
https://blog.csdn.net/hbuxiaoshe/article/details/6560285
标签:let thrift 线程池 ror 列表 客户 server 区别 接收
原文地址:https://www.cnblogs.com/longjmp/p/9708725.html