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通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 Python
python实现读Excel写入.txt的方法
Apr 29 Python
在python里面运用多继承方法详解
Jul 01 Python
Django后台admin的使用详解
Jul 08 Python
python 实现目录复制的三种小结
Dec 04 Python
django框架F&amp;Q 聚合与分组操作示例
Dec 12 Python
python安装读取grib库总结(推荐)
Jun 24 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
python 实现控制鼠标键盘
Nov 27 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
php include,include_once,require,require_once
2008/09/05 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
学习YUI.Ext 第七天--关于View&amp;JSONView
2007/03/10 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
Python实现list反转实例汇总
2014/11/11 Python
Python selenium文件上传方法汇总
2020/11/19 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
Python 求向量的余弦值操作
2021/03/04 Python
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
审核会计岗位职责
2013/11/08 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
宿舍违规检讨书
2014/01/12 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
个人先进事迹总结
2015/02/26 职场文书
行政复议答复书
2015/07/01 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python