一、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 的五种工作模式的更多相关文章

  1. rabbitmq的五种工作模式

    abbitmq的五种工作模式      

  2. RabbitMQ 五种工作模式

    官网介绍:https://www.rabbitmq.com/getstarted.html 五种工作模式的主要特点 简单模式:一个生产者,一个消费者 work模式:一个生产者,多个消费者,每个消费者获 ...

  3. 消息队列rabbitmq的五种工作模式(go语言版本)

    前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由 ...

  4. ARM体系的7种工作模式

    一.ARM体系的CPU有以下7种工作模式:   用户模式(usr)    大多数程序运行于用户模式 特权模式   系统模式(sys)   运行具有特权的操作系统任务 异常模式 中断模式(irq)   ...

  5. 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

    原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...

  6. AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

    --转载https://www.cnblogs.com/starwolf/p/3365834.html https://www.freebuf.com/column/171939.html 分组密码有 ...

  7. PHP5 的五种常用模式

    PHP5 的五种常用模式. 工厂模式 最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合.要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程.在更改一个代码片段时,就会发生问题,系 ...

  8. VMWare提供了三种工作模式上网

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  9. VMWare三种工作模式 :bridge、host-only、nat

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式.这里 ...

随机推荐

  1. Caffe中Interp层的使用

    最近实验当中借鉴了FPN网络,由于FPN网络对图片shape有要求,采用了两种方式,其一是在data_layer.cpp中,对原图进行padding操作:其二是需要对特征图进行类似crop操作,使得两 ...

  2. PHP输出中文乱码问题解决

    在php文件的最上面加上下面的语句: header('Content-Type: text/html; charset=utf-8');   如下图:

  3. TestLink测试管理工具的使用举例—第一篇

    本博客用来详细说明TestLink测试管理工具的使用方法,前两篇博客已经详细说明了TestLink工具的下载,安装及基本登录功能,本篇开始说明其工具的具体使用! 下载安装TestLink工具之后,我们 ...

  4. python 环境下 安装 gdal

    起因:需要做一个城市扩张的东西,然后再GitHub上下载了一段代码,不过作者没怎么说清楚要怎么用,早上琢磨半天,归结到我需要先下载python的gdal模块. 关于:搜索下来,发现gdal(Geosp ...

  5. Power Query Advanced Editor键盘快捷键

    当你点击阅读这篇文章,第一眼看到这首图,是不是不太明白?实际上是小悦对Power BI 功能的12月更新的部分功能很有兴趣,所以今天想用这张张首图作为例,延伸测试键盘快捷键的简单应用,还真别说,确实还 ...

  6. 【leetcode】443. String Compression

    problem 443. String Compression Input ["a","a","b","b"," ...

  7. day02-python与变量

    1.堆区开辟空间存放 变量值  2.将存放 变量值 空间的地址提供给栈区  3.栈区为变量名开辟空间存放提供来的地址 变量直接相互赋值 定义变量的优化机制 定义变量与重新赋值

  8. extjs_10_自己定义combotree组件

    1.项目截图 2.treedata.json { text : "root", expanded : true, expandable : true, children : [{ ...

  9. Web APP 日期选择控件

    github地址: https://github.com/yuanzm/simple-date-picker#simple-date-picker simple-date-picker 基于zepto ...

  10. 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可  如果想把 ...