python使用thrift教程的方法示例


Posted in Python onMarch 21, 2019

一、前言:  

Thrift 是一种接口描述语言和二进制通信协议。以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 Thrift 进行通信的,然后写自动化脚本之前研究了一下。

需要定义一个xxx.thrift的文件, 来生成各种语言的代码,生成之后我们的服务提供者和消费者,都需要把代码引入,服务端把代码实现,消费者直接使用API的存根,直接调用。

和 http 相比,同属于应用层,走 tcp 协议。Thrift 优势在于发送同样的数据,request包 和 response包 要比 http 小很多,在整体性能上要优于 http 。

二、使用方法

环境准备:

从官网上下载 windows 版的 thrift.exe:http://archive.apache.org/dist/thrift/0.9.3/(我这里用的是0.9.3版本)

python版本:Python 3.7.1

pip3 install thrift

1.首先使用 thrift 之前需要定义一个 .thrift 格式的文件,比如 test.thrift

service Transmit {
string sayMsg(1:string msg);
string invoke(1:i32 cmd 2:string token 3:string data)
}

然后运行命令:thrift-0.9.3.exe -gen py test.thrift 生成 python 代码

python使用thrift教程的方法示例

生成如下结构

python使用thrift教程的方法示例

2.然后将生成的 python 代码 和 文件,放到新建的 python 项目中。完成后先运行服务器代码。

服务端代码 server.py:

import json
from test import Transmit
from test.ttypes import *
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
import socket


class TransmitHandler:
  def __init__(self):
    self.log = {}

  def sayMsg(self, msg):
    msg = json.loads(msg)
    print("sayMsg(" + msg + ")")
    return "say " + msg + " from " + socket.gethostbyname(socket.gethostname())

  def invoke(self,cmd,token,data):
    cmd = cmd
    token =token
    data = data
    if cmd ==1:
      return json.dumps({token:data})
    else:
      return 'cmd不匹配'

if __name__=="__main__":
  handler = TransmitHandler()
  processor = Transmit.Processor(handler)
  transport = TSocket.TServerSocket('127.0.0.1', 8000)
  tfactory = TTransport.TBufferedTransportFactory()
  pfactory = TBinaryProtocol.TBinaryProtocolFactory()
  server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
  print("Starting python server...")
  server.serve()

客户端代码 client.py

import sys
import jsonfrom test import Transmit
from test.ttypes import *
from test.constants import *
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol


transport = TSocket.TSocket('127.0.0.1', 8000)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Transmit.Client(protocol)
# Connect!
transport.open()

cmd = 2
token = '1111-2222-3333-4444'
data = json.dumps({"name":"zhoujielun"})
msg = client.invoke(cmd,token,data)
print(msg)
transport.close()

# 执行结果:cmd不匹配

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python 处理数据的实例详解
Aug 10 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
用于业余项目的8个优秀Python库
Sep 21 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
Python命令行click参数用法解析
Dec 19 Python
python matplotlib实现将图例放在图外
Apr 17 Python
python如何快速生成时间戳
Jul 21 Python
Python 在局部变量域中执行代码
Aug 07 Python
python 实现超级玛丽游戏
Nov 25 Python
Python函数中apply、map、applymap的区别
Nov 27 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 #Python
详解python使用turtle库来画一朵花
Mar 21 #Python
python中import与from方法总结(推荐)
Mar 21 #Python
python批量创建指定名称的文件夹
Mar 21 #Python
python根据txt文本批量创建文件夹
Dec 08 #Python
python+os根据文件名自动生成文本
Mar 21 #Python
Python----数据预处理代码实例
Mar 20 #Python
You might like
php 获得汉字拼音首字母的函数
2009/08/01 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
php操作xml
2013/10/27 PHP
PHP循环结构实例讲解
2014/02/10 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
php中yii框架实例用法
2020/12/22 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
用JQuery 实现的自定义对话框
2007/03/24 Javascript
javascript实现的动态文字变换
2007/07/28 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
Python中的高级数据结构详解
2015/03/27 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python之指数与E记法的区别详解
2019/11/21 Python
财务管理职业生涯规划范文
2013/12/27 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
党章学习心得体会2016
2016/01/14 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android