Thrift 的五种工作模式
一、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
Thrift 的五种工作模式的更多相关文章
- rabbitmq的五种工作模式
abbitmq的五种工作模式
- RabbitMQ 五种工作模式
官网介绍:https://www.rabbitmq.com/getstarted.html 五种工作模式的主要特点 简单模式:一个生产者,一个消费者 work模式:一个生产者,多个消费者,每个消费者获 ...
- 消息队列rabbitmq的五种工作模式(go语言版本)
前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由 ...
- ARM体系的7种工作模式
一.ARM体系的CPU有以下7种工作模式: 用户模式(usr) 大多数程序运行于用户模式 特权模式 系统模式(sys) 运行具有特权的操作系统任务 异常模式 中断模式(irq) ...
- 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...
- AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
--转载https://www.cnblogs.com/starwolf/p/3365834.html https://www.freebuf.com/column/171939.html 分组密码有 ...
- PHP5 的五种常用模式
PHP5 的五种常用模式. 工厂模式 最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合.要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程.在更改一个代码片段时,就会发生问题,系 ...
- VMWare提供了三种工作模式上网
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...
- VMWare三种工作模式 :bridge、host-only、nat
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式.这里 ...
随机推荐
- Caffe中Interp层的使用
最近实验当中借鉴了FPN网络,由于FPN网络对图片shape有要求,采用了两种方式,其一是在data_layer.cpp中,对原图进行padding操作:其二是需要对特征图进行类似crop操作,使得两 ...
- PHP输出中文乱码问题解决
在php文件的最上面加上下面的语句: header('Content-Type: text/html; charset=utf-8'); 如下图:
- TestLink测试管理工具的使用举例—第一篇
本博客用来详细说明TestLink测试管理工具的使用方法,前两篇博客已经详细说明了TestLink工具的下载,安装及基本登录功能,本篇开始说明其工具的具体使用! 下载安装TestLink工具之后,我们 ...
- python 环境下 安装 gdal
起因:需要做一个城市扩张的东西,然后再GitHub上下载了一段代码,不过作者没怎么说清楚要怎么用,早上琢磨半天,归结到我需要先下载python的gdal模块. 关于:搜索下来,发现gdal(Geosp ...
- Power Query Advanced Editor键盘快捷键
当你点击阅读这篇文章,第一眼看到这首图,是不是不太明白?实际上是小悦对Power BI 功能的12月更新的部分功能很有兴趣,所以今天想用这张张首图作为例,延伸测试键盘快捷键的简单应用,还真别说,确实还 ...
- 【leetcode】443. String Compression
problem 443. String Compression Input ["a","a","b","b"," ...
- day02-python与变量
1.堆区开辟空间存放 变量值 2.将存放 变量值 空间的地址提供给栈区 3.栈区为变量名开辟空间存放提供来的地址 变量直接相互赋值 定义变量的优化机制 定义变量与重新赋值
- extjs_10_自己定义combotree组件
1.项目截图 2.treedata.json { text : "root", expanded : true, expandable : true, children : [{ ...
- Web APP 日期选择控件
github地址: https://github.com/yuanzm/simple-date-picker#simple-date-picker simple-date-picker 基于zepto ...
- 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可 如果想把 ...