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使用cPickle模块序列化实例
Sep 25 Python
Python编程实现的图片识别功能示例
Aug 03 Python
Python常见字典内建函数用法示例
May 14 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
Python交互式图形编程的实现
Jul 25 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
python程序需要编译吗
Jun 19 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
python中的sys模块和os模块
Mar 20 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
jQuery验证插件validate使用详解
2016/05/11 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
公共事业管理本科生求职信
2013/10/07 职场文书
监察建议书格式
2014/05/19 职场文书
课内比教学心得体会
2014/09/09 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
幸福终点站观后感
2015/06/04 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers