thrift源码解析——深度学习模型的服务器端工程化落地方案_java项目深度学习算法工程化-程序员宅基地

技术标签: python  深度学习  云服务器  数据库  

来源 | 极链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

TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低。

1、处理流程

截图 (4).png

2、源码分析

截图 (5).png

设置TServerSocket的listen()方法启动连接监听。
以阻塞的方式接受客户端的连接请求,每进入一个连接即为其创建一个TSocket对象(封装socket连接)。
为客户端创建输入传输通道对象、输出传输通道对象、输入协议对象和输出协议对象。
processor对象为服务模型创建之前创建的,用来处理具体的业务请求。

二、TNonblockingServer TThreadPoolServer TThreadedServer

这三个服务模型放在一起讲,是因为python中多线程有点鸡肋。而这三种模型都是利用了多线程技术。

1、首先来看TThreadedServer,目的是为每个client请求创建单独的线程进行业务处理

截图 (6).png

2、然后是TThreadPoolServer,服务启动时先创建好self.threads个线程,每个线程负责从队列clients中获取客户端连接TSocket对象。而主线程负责accept客户端的连接并创建TSocket对象,放入clients队列。

截图 (7).png
截图 (8).png

3、最后是TNonblockingServer,这个稍微复杂一点。类似于java版thrift中的THsHaServer,思路是服务启动时创建threads个线程负责处理task队列中的任务消息。而主线程利用io多路复用技术将准备好的可读消息放入task队列供业务线程处理,同时在处理结束后可写时直接将结果返回给客户端。

截图 (9).png
截图 (11).png
截图 (10).png

三、TForkingServer TProcessPoolServer

这两个服务模型在java中并没有发现,目的也是规避python的gil锁问题。
其中TForkingServer,服务端每次监听到client请求,会os.fork一个子进程进行业务处理。
截图 (12).png

而这显然fork会消耗一定时间,而且服务端资源不是无限的,推荐还是用下面这个,TProcessPoolServer。服务启动时创建指定个数的进程,负责监听同一个端口的客户端请求,并进行业务处理。

截图 (14).png
截图 (13).png

以上就是主要的python版thrift服务模型介绍。需要注意的是socket.accept()从全连接队列拿连接,连接队列(全连接和半连接)总大小在thrfit里默认是128,可修改

截图 (15).png

四、实际应用:

测试环境:
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/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51072772/article/details/108996654

智能推荐

用了10年的MacBook内存不够怎么办?Mac空间不足怎么解决?_macbook内存103g-程序员宅基地

文章浏览阅读306次,点赞8次,收藏4次。CleanMyMac X的系统垃圾清理和大型文件清理功能能简单完美解决这一问题,用过CleanMyMac X的用户都对此给予很高的评价。随着使用时间的增长,我们会发现Mac电脑的存储空间越来越少,这时候我们就需要对Mac电脑进行清理,以释放更多的存储空间。那么,Mac空间不足怎么解决呢?关闭不需要自动启动的应用程序,能提高Mac的运行速度。不想手动清理的盆友,可以下载专业的清理软件CleanMyMac X ,它能一键清理系统垃圾。你上网的次数越多,浏览器的缓存就越大,我经常使用的是自带浏览器Safari。_macbook内存103g

机器学习——概率分类(三)高斯概率密度与混合高斯模型_概率密度分类-程序员宅基地

文章浏览阅读5.2k次,点赞7次,收藏34次。机器学习——概率分类(三)高斯概率密度与混合高斯模型在之前的文章机器学习——概率分类(一)朴素贝叶斯模型一文中,我们主要介绍了机器学习中的概率分类问题。我们提出了简单的朴素贝叶斯模型来进行概率密度的估计。在本篇文章中,我们主要介绍概率密度估计的第二种方法——高斯密度估计。1 高斯概率密度原理1.1 高斯概率密度引入首先,我们假设样本X符合的是高斯分布,当X的维度是一维的时候,其符合的概率分..._概率密度分类

lvc_alv 实现 checkbox 多选的功能 g_grid->check_changed_data_alv checkbox选中内表值没变-程序员宅基地

文章浏览阅读7.2k次。 不知道同志们 有没有遇到在做alv报表时,会让某列出力为checkbox, 并且要能达到:通过鼠标左键选择打勾,并且能多选,这样的功能需求。 一般情况下通过call:REUSE_ALV_GRID_DISPLAY实现ALV报表,但是这种方式出力的话,对多个‘checkbox’勾选时,在"I_CALLBACK_USER_COMMAND" form 中始终只能_alv checkbox选中内表值没变

如何修改seekBar的样式_怎么修改seekbar的粗细-程序员宅基地

文章浏览阅读199次。进入Android SDK中的values目录D:\AndroidSDK\platforms\android-25\data\res\values进入styles.xml,找到自己想要查看的SDK自带的样式进入drawable文件夹下D:\AndroidSDK\platforms\android-25\data\res\drawable将对应的xml文件拷贝进项目中的drawabl..._怎么修改seekbar的粗细

【阵列优化】基于遗传算法实现MIMO雷达阵列阵元位置优化问题附Matlab代码-程序员宅基地

文章浏览阅读859次,点赞30次,收藏23次。多输入多输出(MIMO)雷达技术近年来得到了广泛的关注,其能够有效提高雷达的探测性能和抗干扰能力。阵列优化是MIMO雷达研究中的一个重要课题,其目标是优化阵元的布局,以获得最佳的雷达性能。本文提出了一种基于遗传算法的MIMO雷达阵列阵元位置优化方法。该方法首先建立了MIMO雷达阵列的优化模型,然后利用遗传算法对模型进行求解,最终获得最佳的阵元布局。仿真结果表明,该方法能够有效提高MIMO雷达的性能。

cond怎么读_cond是什么意思_cond怎么读_cond翻译_用法_发音_词组_同反义词_[医][=condenser]冷凝器_聚光器_电容器-新东方在线英语词典...-程序员宅基地

文章浏览阅读1.4k次。权威例句The Java? Language Specification Se cond EditionThe SIESTA method for ab initio order-N materials simulation. J. Phys. Cond. Matter. 14(11), 2745-2779EXAFS Study on the Local Structure of a New Hi..._cond中文意思

随便推点

html5在线加密,HTML技巧——加密网页-程序员宅基地

文章浏览阅读2.4k次。输入密码才能访问代码一(放在HTML顶部或headn之间)functionpassword(){vartestV=1;varpass1=prompt('请输入密码','');while(testVif(!pass1)history.go(-1);if(pass1=="123"){//初始密码123alert('密码正确');break;}testV+=1;varpa..._html在线加密

matlab图形标注与修饰函数title、xlabel、ylabel 【matlab图行绘制二】_matlab title用法-程序员宅基地

文章浏览阅读1.8w次,点赞10次,收藏87次。MATLAB 图形标注与修饰函数在 MATLAB中,可利用 Figure窗口的菜单和工具栏对图形进行标注、修饰等,操作简单,此外,还可以利用 MATLAB中自带的函数来进行图形的修饰。下面将对其进行介绍绘制图形以后,需要对图形进行标注、说明等修饰性的处理,以增加图的可读性,使之反映出更多的信息。在 MATLAB中,可利用 Figure窗口的菜单和工具栏对图形进行标注、修饰等,操作简单,此外,还可以利用 MATLAB中自带的函数来进行图形的修饰。下面将对其进行介绍title 函数title函数用于给_matlab title用法

012、Python+fastapi,第一个后台管理项目走向第12步:建立python+fastapi项目,建个接口测试一下是否能跑通-程序员宅基地

文章浏览阅读692次,点赞29次,收藏23次。上图是做了个登录接口,很简单很简单,只是为了跑通代码证明接口文档正常,数据库正常我们贴下代码安装dao==》server==》controler。

Android使用系统文件管理器选择文件,并将Uri转换为File_android uri to file-程序员宅基地

文章浏览阅读6.1w次,点赞21次,收藏27次。0.README1.利用系统文件管理器选择文件得到Uri码2.Uri转化成File能读取的路径参考文献0.README本文的android代码测试机型为:小米4。首先用系统文件管理器选择文件,获得文件Uri,然后解析Uri得到文件真实路径。 1.利用系统文件管理器选择文件得到Uri码这里借鉴的是程序员宅基地里别的大佬的回答(见参考文献..._android uri to file

Windows下监控文件是否已经写完成_file_notify_change_last_write-程序员宅基地

文章浏览阅读1.2k次。主题文件存储作为数据持久化存储方式之一,很多程序中会将结果数据保存在文件中的情况,如xml文件。而文件写完成才代表一个完整的数据结构生成。你是否遇到过通过ftp传输文件,接收端需要对文件进行解析处理。结果文件未上传完毕,接收端软件就对文件进行解析,造成解析失败的问题?你是否遇到过通过文件方式进行数据交互的程序,文件还未完全生成就开始解析,造成交互失败的问题?如果有,那么这篇文章或许会有一..._file_notify_change_last_write

【从零开始玩量化14】如何获取申万行业数据_免费申万行业指数历史数据下载-程序员宅基地

文章浏览阅读2.9k次。申万行业分类,是我非常喜欢用的一个股票行业分类标准,用它来分类股票,做行业对比,梳理产业链上下游结构,都是非常好的工具。_免费申万行业指数历史数据下载

推荐文章

热门文章

相关标签