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中的一些类型转换函数小结
Feb 10 Python
python使用循环实现批量创建文件夹示例
Mar 25 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
numpy中矩阵合并的实例
Jun 15 Python
python如何生成各种随机分布图
Aug 27 Python
Python使用googletrans报错的解决方法
Sep 25 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
python可视化实现KNN算法
Oct 16 Python
python实现飞机大战小游戏
Nov 08 Python
MATLAB数学建模之画图汇总
Jul 16 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
php 常用的系统函数
2017/02/07 PHP
PHP7新增函数
2021/03/09 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
jQuery实现增删改查
2020/12/22 jQuery
Python实现在线音乐播放器
2017/03/03 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Python 读写文件的操作代码
2018/09/20 Python
Python数据可视化之画图
2019/01/15 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
《庐山的云雾》教学反思
2014/04/22 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python