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实现的各种排序算法代码
Mar 04 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
详解python进行mp3格式判断
Dec 23 Python
Python3中的json模块使用详解
May 05 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
Python的pygame安装教程详解
Feb 10 Python
pytorch实现MNIST手写体识别
Feb 14 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
python turtle绘图命令及案例
Nov 23 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
redis 队列操作的例子(php)
2012/04/12 PHP
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
React key值的作用和使用详解
2018/08/23 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
浅述python2与python3的简单区别
2018/09/19 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
《少年王冕》教学反思
2014/04/11 职场文书
起诉意见书范文
2015/05/19 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
python urllib库的使用详解
2021/04/13 Python
MySQL为id选择合适的数据类型
2021/06/07 MySQL
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android
Java spring单点登录系统
2021/09/04 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android
vue动态绑定style样式
2022/04/20 Vue.js