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写一个贪吃蛇游戏实例代码
Aug 21 Python
Python文件操作之合并文本文件内容示例代码
Sep 19 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
基于Django用户认证系统详解
Feb 21 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
pandas带有重复索引操作方法
Jun 08 Python
python实现NB-IoT模块远程控制
Jun 20 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
python中threading开启关闭线程操作
May 02 Python
Django展示可视化图表的多种方式
Apr 08 Python
Python Django搭建文件下载服务器的实现
May 10 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
php 输入输出流详解及示例代码
2016/08/25 PHP
PHP二维数组去重算法
2016/12/17 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
javascript hashtable实现代码
2009/10/13 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
React 路由懒加载的几种实现方案
2018/10/23 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
vue更改数组中的值实例代码详解
2020/02/07 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
Python注释详解
2016/06/01 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
python中图像通道分离与合并实例
2020/01/17 Python
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
Linux操作面试题
2015/02/11 面试题
迎元旦广播稿
2014/02/22 职场文书
本科生就业推荐信
2014/05/19 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
周末问候语大全
2015/11/10 职场文书