python实现Thrift服务端的方法


Posted in Python onApril 20, 2021

近期在项目中存在跨编程语言协作的需求,使用到了Thrift。本文将记录用python实现Thrift服务端的方法。

环境准备

  • 根据自身实际情况下载对应的Thrift编译器,比如我在Windows系统上使用的是thrift-0.9.3.exe 。下载地址:http://archive.apache.org/dist/thrift/
  • python安装thrift库:pip install thrift

编写.thrift文件

.thrift文件定义了Thrift服务端和Thrift客户端的通信接口,在该文件中定义的接口需由服务端实现,并可被客户端调用。Thrift编译器会调用.thrift文件生成不同语言的thrift代码,用于之后实现thrift服务端或thrift客户端。

.thrift文件的编写规则可参考Thrift白皮书。下面将以demo.thrift文件举例

service DemoService{
    string ping(1:string param)
    map<i32,string> get_int_string_mapping_result(1:i32 key, 2:string value)
    bool get_bool_result()
}

生成python对应的thrift代码

使用以下命令可以生成不同语言的thrift代码:

thrift --gen <language> <Thrift filename>

 通过thrift-0.9.3.exe --gen py demo.thrift 命令生成python版本的thrift文件,文件夹为gen-py,如下所示:

python实现Thrift服务端的方法

编写服务端

编写服务端server.py,用于实现在demo.thrift文件中定义的接口功能。

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
import sys

sys.path.append("./gen-py/")
from demo import DemoService
import random


class DemoServer:
    def __init__(self):
        self.log = {}

    def ping(self, param):
        return "echo:" + param

    def get_int_string_mapping_result(self, key, value):
        return {key: value}

    def get_bool_result(self):
        return random.choice([True, False])


if __name__ == '__main__':
    # 创建处理器
    handler = DemoServer()
    processor = DemoService.Processor(handler)

    # 监听端口
    transport = TSocket.TServerSocket(host="0.0.0.0", port=9999)

    # 选择传输层
    tfactory = TTransport.TBufferedTransportFactory()

    # 选择传输协议
    pfactory = TBinaryProtocol.TBinaryProtocolFactory()

    # 创建服务端
    server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)

    # 设置连接线程池数量
    server.setNumThreads(5)

    # 启动服务
    server.serve()

编写客户端用于测试

编写客户端client.py,用于测试服务端功能是否可用。

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
import sys
sys.path.append("./gen-py/")

from demo import DemoService


if __name__ == '__main__':
    transport = TSocket.TSocket('127.0.0.1', 9999)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = DemoService.Client(protocol)

    # 连接服务端
    transport.open()

    recv = client.ping("test")
    print(recv)

    recv = client.get_int_string_mapping_result(10, "MyThrift")
    print(recv)

    recv = client.get_bool_result()
    print(recv)

    # 断连服务端
    transport.close()

编写完成后,整个项目结构如下图所示:

python实现Thrift服务端的方法

测试服务端

运行服务端server.py后,运行客户端client.py,打印的内容如下:

echo:test
{10: 'MyThrift'}
True

此时客户端能够正常调用服务端所提供的接口。(PS:在调试过程中,也许需要修改gen-py文件夹中Thrift编译器生成的python代码)

以上就是python实现Thrift服务端的方法的详细内容,更多关于python实现Thrift服务端的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用scrapy抓取网站sitemap信息的方法
Apr 08 Python
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
python的命名规则知识点总结
Oct 04 Python
Python实现使用dir获取类的方法列表
Dec 24 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Jupyter Notebook打开任意文件夹操作
Apr 14 Python
django前端页面下拉选择框默认值设置方式
Aug 09 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
Python用SSH连接到网络设备
Feb 18 Python
Python 语言实现六大查找算法
Jun 30 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
我的论坛源代码(七)
2006/10/09 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
python Django模板的使用方法
2016/01/14 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
详解django中使用定时任务的方法
2018/09/27 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
最新结婚典礼主持词
2014/03/14 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
党委领导班子整改方案
2014/09/30 职场文书
社区干部培训心得体会
2016/01/06 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js