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的关键字监控及告警
Jul 06 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
一文总结学习Python的14张思维导图
Oct 17 Python
详谈python在windows中的文件路径问题
Apr 28 Python
python 重定向获取真实url的方法
May 11 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
详解Python文件修改的两种方式
Aug 22 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
一段php加密解密的代码
2006/10/09 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
传智播客学习之java 反射
2009/11/22 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
python实现Flappy Bird源码
2018/12/24 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
图书室标语
2014/06/21 职场文书
树转促学习心得体会
2014/09/10 职场文书
2014年个人总结范文
2015/03/09 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers