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实现快速多线程ping的方法
Jul 15 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 Python
eclipse创建python项目步骤详解
May 10 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 Python
Python OpenCV实现测量图片物体宽度
May 27 Python
Python安装并操作redis实现流程详解
Oct 13 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 Python
python基础之while循环语句的使用
看看如何用Python绘制小米新版天价logo
基于python制作简易版学生信息管理系统
基于python的matplotlib制作双Y轴图
90行Python代码开发个人云盘应用
基于python实现银行管理系统
python爬虫框架feapde的使用简介
Apr 20 #Python
You might like
让PHP更快的提供文件下载的代码
2012/06/13 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
手工社团活动方案
2014/02/17 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
奠基仪式策划方案
2014/05/15 职场文书
学习型班组申报材料
2014/05/31 职场文书
个人存款证明书
2014/10/18 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
故宫的导游词
2015/01/31 职场文书
参加招聘会后的感想
2015/08/10 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
Win11开始菜单添加休眠选项
2022/04/19 数码科技
Python代码实现双链表
2022/05/25 Python