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 threading多线程编程实例
Sep 18 Python
Python批量重命名同一文件夹下文件的方法
May 25 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
理解Python中的绝对路径和相对路径
Aug 30 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
pycharm设置鼠标悬停查看方法设置
Jul 29 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
Django使用Profile扩展User模块方式
May 14 Python
Python编程源码报错解决方法总结经验分享
Oct 05 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
用PHP实现WEB动态网页静态
2006/10/09 PHP
smarty的保留变量问题
2008/10/23 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
Python 字典与字符串的互转实例
2017/01/13 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
python连接mongodb密码认证实例
2018/10/16 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
12月红领巾广播稿
2014/02/13 职场文书
司法助理专业自荐书
2014/06/13 职场文书
旷工检讨书大全
2015/08/15 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers