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类库使用例子
Nov 22 Python
python实现按任意键继续执行程序
Dec 30 Python
Python 正则表达式实现计算器功能
Apr 29 Python
Django自定义分页效果
Jun 27 Python
Sanic框架安装与简单入门示例
Jul 16 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
解决pyshp UnicodeDecodeError的问题
Dec 06 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
我的论坛源代码(三)
2006/10/09 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
js仿360开机效果
2019/12/26 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
python基础教程之Filter使用方法
2017/01/17 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
python pandas修改列属性的方法详解
2018/06/09 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
Python用Jira库来操作Jira
2020/12/28 Python
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
公证委托书大全
2014/04/04 职场文书
2014年度个人总结范文
2015/03/09 职场文书
贷款担保书范本
2015/09/22 职场文书
调研报告的主要写法
2019/04/18 职场文书
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫