1、thrift 共有5中工做模式,分紅阻塞和非阻塞:apache
阻塞:TSimpleServer、TThreadPoolServer多線程
非阻塞:TNonblockingServer、THsHaServer、TThreadedSelectorServer併發
這裏的阻塞是指,若是同時有多個新連接到來,但一次只能處理一個新鏈接,即當前的連接會阻塞後續連接的處理。函數
非阻塞則是,當有許多新鏈接到來時,會同時得到這些連接的列表,一次性處理一批連接。高併發
兩者的區別在加上線程池的時候就顯現出來了,阻塞模式一次只能往池子裏扔一個連接,而非阻塞一次能夠扔一堆連接。this
但池子自己大小是優先的,因此通常高併發場景並不適合用線程池模式。spa
具體的工做模式參考:https://blog.csdn.net/houjixin/article/details/42779915.net
2、線程池模式代碼:線程
做爲服務端,應該可以同時接收多個客戶端傳來的數據,因此服務端應該實現多線程機制。server
按如下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