来源 | 极链AI云(性价比最高的共享GPU算力平台,双十活动进行中 10.9-10.11,充值就送!最多可送2500元现金券!免费试用地址:https://cloud.videojj.com/)
文章来源:https://cloud.videojj.com/bbs/topic/28/thrift源码解析-深度学习模型的服务器端工程化落地方案/2
有了训练好的模型,怎么用服务调用?很多人可能会想到用flask进行http调用。那如果是内网呢?如果希望去掉http封包解包一系列耗时操作呢?自然我们会想到rpc协议。
RPC(Remote Procedure Call)是一种远程调用协议,简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务、分布式计算、远程服务调用等许多场景。有很多优秀的rpc框架,如gRpc、thrift、Dubbo、Hessian等,本文来介绍一下thrift框架中的服务模型。
为什么需要了解服务模型?因为为了增大rpc服务端的并发处理能力,需要选择更合适的thrift服务模型,这就需要我们了解各个服务模型的特性。
下面对支持python的各个服务模型做具体介绍:
TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低。
1、处理流程
2、源码分析
设置TServerSocket的listen()方法启动连接监听。
以阻塞的方式接受客户端的连接请求,每进入一个连接即为其创建一个TSocket对象(封装socket连接)。
为客户端创建输入传输通道对象、输出传输通道对象、输入协议对象和输出协议对象。
processor对象为服务模型创建之前创建的,用来处理具体的业务请求。
这三个服务模型放在一起讲,是因为python中多线程有点鸡肋。而这三种模型都是利用了多线程技术。
1、首先来看TThreadedServer,目的是为每个client请求创建单独的线程进行业务处理
2、然后是TThreadPoolServer,服务启动时先创建好self.threads个线程,每个线程负责从队列clients中获取客户端连接TSocket对象。而主线程负责accept客户端的连接并创建TSocket对象,放入clients队列。
3、最后是TNonblockingServer,这个稍微复杂一点。类似于java版thrift中的THsHaServer,思路是服务启动时创建threads个线程负责处理task队列中的任务消息。而主线程利用io多路复用技术将准备好的可读消息放入task队列供业务线程处理,同时在处理结束后可写时直接将结果返回给客户端。
这两个服务模型在java中并没有发现,目的也是规避python的gil锁问题。
其中TForkingServer,服务端每次监听到client请求,会os.fork一个子进程进行业务处理。
而这显然fork会消耗一定时间,而且服务端资源不是无限的,推荐还是用下面这个,TProcessPoolServer。服务启动时创建指定个数的进程,负责监听同一个端口的客户端请求,并进行业务处理。
以上就是主要的python版thrift服务模型介绍。需要注意的是socket.accept()从全连接队列拿连接,连接队列(全连接和半连接)总大小在thrfit里默认是128,可修改
测试环境:
64核cpu
测试结果:
无gpu操作,单次处理0.3s左右,100次请求
1、客户端单个client串行发送100次,或者10线程分别发送10次,共享同一个client,结果均为33秒多。可见对于单个client连接服务器处理均是串行,与代码显示相符。
2、客户端10线程分别发送10次,每个线程创建1个client,服务器端进程池模型(TProcessPoolServer),进程数10。用时3秒多。同样说明对于单个client连接服务器处理均是串行。
3、客户端100线程分别发送1次,每个线程创建1个client,服务器端进程池模型(TProcessPoolServer),进程数10。用时3秒多,比测试2略多一点,可以预见服务端创建销毁client,占据了一点时间。
4、客户端10线程分别发送10次,每个线程创建1个client,服务器端non-blocking模型(TNonblockingServer),处理线程数10。结果和测试1、2差不多时长,说明cpu密集型任务,python不适合多线程.
5、客户端10线程分别发送10次,每个线程创建1个client,服务器端进程模型(TForkingServer),为每个client创建fork进程。用时4秒多。说明fork子进程耗时明显
6、客户端100线程分别发送1次,每个线程创建1个client,服务器端进程模型(TForkingServer),为每个client创建fork进程。用时11秒多,同样说明fork子进程耗时明显
极链AI云(性价比最高的共享GPU算力平台,双十活动进行中 10.9-10.11,充值就送!最多可送2500元现金券!免费试用地址:https://cloud.videojj.com/)
文章浏览阅读2.7k次。首先确保你的电脑有安装git环境,本人使用的是windows下的git环境。双击桌面图标 的Git Bash 打开窗口修改配置git config --global user.namegit config --global user.email如:git config --global user.name "muzidigbig"git config --glo..._gitlab 18: transfer closed with outstanding read data remaining
文章浏览阅读311次,点赞2次,收藏2次。springboot整合shiro快速入门简洁版_springboot+shiro快速入门:简洁版(快速搭建示例)
文章浏览阅读347次。点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料最近,闲来无事,为了改变一下枯燥的编程环境,特地搜寻了下有助提升代码功力的..._activate mybatis log
文章浏览阅读7k次。Docker和Jenkins像DevOps界的巧克力和花生酱那样,它们的组合产生了无数的机会,当然也产生了很多难题,笔者将提及这两个方面。本文中,我假定读者已经熟悉Jenkins和Docker,我将把焦点放在特定的配置上而不是把笔墨花费在许多博文已经介绍过的入门概念上。设定目标我所要达成的目标其实非常简单:在一个容器中搭建Jenkins主节点,并且在多个主机上搭建多个JNLP代理容器。这些代理节点..._jenkins 插件containernode.inside
文章浏览阅读359次。给定一棵二叉树,求该二叉树的深度二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度时间限制:1000内存限制:65535输入第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从1到n,根结点为1,n _青少年 c语言编程 题目
文章浏览阅读594次。unity接sdk,打包报错 No resource found that matches the given name ‘Theme.AppCompat.Light’.这是因为sdk中用了这个主题,冒然的删除,会导致后面出来的功能有问题使用appcompat-v7-23.0.0.aar解决,这个里面包含了资源,单纯的jar包不行appcompat-v7-23.0.0.aar可以通过androidsdk文件中SDKManager下载Unity接sdk,运行中报错java.lang.NoClassD_unity3d 启动aar包的android activity不能显示
文章浏览阅读4.4k次,点赞2次,收藏23次。小波变换3级分解Mallat图:将带噪语音作为输入信号进行逐级DWT小波分解,并将分解出的低频成分cA3cA_3cA3与强制置0后的高频成分cD3cD_3cD3,cD2cD_2cD2,cD1cD_1cD1进行小波重构。Demo:clc,clear[x,Fs]= audioread('MUsic_Test.wav');snr = 20; %设定信噪比,单位dbnoise = randn(size(x)); % 用randn函数产生高斯白噪声Nx = length(x_db4小波
文章浏览阅读8.3k次,点赞5次,收藏34次。首先需要安装 snmp ,使用下面的命令进行安装安装完毕之后,使用下面的命令查看是否安装成功当命令行显示如图即为安装成功。_snmp工具
文章浏览阅读6.4k次,点赞5次,收藏40次。练习打字的官网:http://dazi.kukuw.com/关于打字的详细介绍:一个过来人的打字指法纠正之路_怎么敲键盘
文章浏览阅读9.6k次,点赞3次,收藏68次。一,网络安全体系结构网络安全体系结构是对网络信息安全基本问题的应对措施的集合,通常由保护,检测,响应和恢复等手段构成。1,网络信息安全的基本问题研究信息安全的困难在于:边界模糊数据安全与平台安全相交叉;存储安全与传输安全相制约;网络安全,应用安全与系统安全共存;集中的安全模式与分权制约安全模式相互竞争等。评估困难安全结构非常复杂,网络层,系统层,应用层的安全设备,安全协议和安全程序构成一个有机的整体,加上安全机制与人的互动性,网络的动态运行带来的易变性,使得评价网络安全性成为极_网络安全解决方案
文章浏览阅读1.2k次,点赞22次,收藏29次。QGIS在Windows下的编译——QGIS3.28.15 + Qt5.15.3 +CMake3.28.0 + VS2022 ---64位版本_qgis windows编译
文章浏览阅读1.8k次,点赞2次,收藏3次。BAAF-Net代码是基于RandLANet编写的,所以在数据预处理和训练策略是基本是一致的,这里我们只介绍一下BAAF-Net的网络结构。_baafnet