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中logging包的使用总结
Feb 28 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
Python数据集切分实例
Dec 08 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
python中文分词库jieba使用方法详解
Feb 11 Python
Python 字符串池化的前提
Jul 03 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
python中pickle模块浅析
Dec 29 Python
Django中template for如何使用方法
Jan 31 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
PHP生成plist数据的方法
2015/06/16 PHP
10款实用的PHP开源工具
2015/10/23 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
php生成微信红包数组的方法
2019/09/05 PHP
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
vue--vuex详解
2019/04/15 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
python 文件操作删除某行的实例
2017/09/04 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
python实现三种随机请求头方式
2021/01/05 Python
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
.NET是怎么支持多种语言的
2015/02/24 面试题
新闻传播专业求职信
2014/07/22 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
承诺函格式模板
2015/01/21 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
pt-archiver 主键自增
2022/04/26 MySQL