Python使用Thrift
0x00
首先需要安装python的thrift包
sudo pip install thrift
- 1
0x01
编写一个简单接IDL文件helloworld.thrift
const string HELLO_WORLD = "world"
service HelloWorld {
void ping(),
string sayHello(),
string sayMsg(1:string msg)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
thrift脚本通过Thrift编辑器生成所要求的python开发语言代码。即:
thrift -r --gen py helloworld.thrift
- 1
生成gen-py目录:
├── gen-py
│ ├── helloworld
│ │ ├── constants.py
│ │ ├── HelloWorld.py
│ │ ├── HelloWorld-remote
│ │ ├── __init__.py
│ │ └── ttypes.py
│ └── __init__.py
└── helloworld.thrift
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
0x02
Thrift是一个典型的CS结构,客户端和服务端可以使用不同的语言开发。本文以python为例:
PythonServer.py
import sys
sys.path.append('./gen-py')
from helloworld import HelloWorld
from helloworld.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 HelloWorldHandler:
def __init__(self):
self.log = {}
def ping(self):
print "ping()"
def sayHello(self):
print "sayHello()"
return "say hello from " + socket.gethostbyname(socket.gethostname())
def sayMsg(self, msg):
print "sayMsg(" + msg + ")"
return "say " + msg + " from " + socket.gethostbyname(socket.gethostname())
handler = HelloWorldHandler()
processor = HelloWorld.Processor(handler)
transport = TSocket.TServerSocket('127.0.0.1',30303)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
print "Starting python server..."
server.serve()
print "done!"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
PythonClient.py
import sys
sys.path.append('./gen-py')
from helloworld import HelloWorld
from helloworld.ttypes import *
from helloworld.constants import *
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
try:
# Make socket
transport = TSocket.TSocket('127.0.0.1', 30303)
# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)
# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# Create a client to use the protocol encoder
client = HelloWorld.Client(protocol)
# Connect!
transport.open()
client.ping()
print "ping()"
msg = client.sayHello()
print msg
msg = client.sayMsg(HELLO_WORLD)
print msg
transport.close()
except Thrift.TException, tx:
print "%s" % (tx.message)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
当前目录结构:
├── gen-py
├── helloworld.thrift
├── PythonClient.py
└── PythonServer.py
- 1
- 2
- 3
- 4
0x03
运行server端:
$ python PythonServer.py
Starting python server...
- 1
- 2
运行client端:
$ python PythonClient.py
ping()
say hello from 10.27.73.176
say world from 10.27.73.176
- 1
- 2
- 3
- 4
server端输出:
ping()
sayHello()
sayMsg(world)
- 1
- 2
- 3
0x04 使用thriftpy
thriftpy(现已更新为thriftpy2)对thrift进行了封装,可以动态解析thrift接口文件。项目地址:https://github.com/Thriftpy/thriftpy2
安装thriftpy2
sudo pip install thriftpy2
- 1
编写IDL
pingpong.thrift
service PingService {
string ping(),
}
service AargsPingService {
string ping(1:string ping);
}
service Sleep {
oneway void sleep(1: i32 seconds)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
编写代码
server.py
# coding=utf-8
import thriftpy2
from thriftpy2.rpc import make_server
pp_thrift = thriftpy2.load("pingpong.thrift", module_name="pp_thrift")
# 实现.thrift文件定义的接口
class Dispatcher(object):
def ping(self):
print("ping pong!")
return 'pong'
def main():
# 定义监听的端口和服务
server = make_server(pp_thrift.PingService, Dispatcher(), '127.0.0.1', 6000)
print("serving...")
server.serve()
if __name__ == '__main__':
main()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
client.py
# coding=utf-8
import thriftpy2
#from thriftpy2.rpc import client_context
from thriftpy2.rpc import make_client
# 读入thrift文件,module_name最好与server端保持一致,也可以不保持一致
pp_thrift = thriftpy2.load("pingpong.thrift", module_name="pp_thrift")
def main():
#with client_context(pp_thrift.PingService, '127.0.0.1', 6000) as c:
# pong = c.ping()
# print(pong)
client = make_client(pp_thrift.PingService, '127.0.0.1', 6000)
print(client.ping())
if __name__ == '__main__':
main()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
注释里是另一种创建链接的方式。
目录结构:
├── client.py
├── pingpong.thrift
└── server.py
- 1
- 2
- 3
运行
运行server端:
$ python server.py
serving...
- 1
- 2
运行client端:
$ python client.py
pong
- 1
- 2
server端输出:
ping pong!
Python使用Thrift的更多相关文章
- python Hbase Thrift pycharm 及引入包
cp -r hbase/ /usr/lib/python2.7/site-packages/ 官方示例子http://code.google.com/p/hbase-thrift/source/bro ...
- Golang&Python测试thrift
接上篇,安装好之后,就开始编写IDL生成然后测试. 一.生成运行 参考 http://www.aboutyun.com/thread-8916-1-1.html 来个添加,查询. namespace ...
- Python实现Thrift Server
近期在项目中存在跨编程语言协作的需求,使用到了Thrift.本文将记录用python实现Thrift服务端的方法. 环境准备 根据自身实际情况下载对应的Thrift编译器,比如我在Windows系统上 ...
- 【原创】用python连接thrift Server 去执行sql的问题总汇
场景:python和现有产品的结合和应用——python的前瞻性调研 环境:centos7 0.首先确保安装了python和pyhive,下面是连接代码: #!/usr/bin/env python ...
- python 使用 thrift 教程
一.前言: Thrift 是一种接口描述语言和二进制通信协议.以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 Thrift 进行通信的,然后写自动化脚本之前研究了一下. ...
- 【hbase】使用thrift with python 访问HBase
HBase 版本: 0.98.6 thrift 版本: 0.9.0 使用 thrift client with python 连接 HBase 报错: Traceback (most recent ...
- thrift例子:python客户端/java服务端
java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...
- thrift安装及python和c++版本调试
一.安装过程 1.安装依赖库 ]# yum install boost-devel-static libboost-dev libboost-test-dev libboost-program-opt ...
- Python Thrift 简单示例
本文基于Thrift-0.10,使用Python实现服务器端,使用Java实现客户端,演示了Thrift RPC调用示例.Java客户端提供两个字符串参数,Python服务器端计算这两个字符串的相似度 ...
随机推荐
- js设置元素指定时间隐藏
$().fadeOut(); js指定时间隐藏
- Gamma阶段第九次scrum meeting
每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...
- windows7 安装 docker-compose
这篇博客,默认你已经安装了docker,下面介绍如何安装docker-compose 1.访问docker-compose的git地址 2.找到最新版的docker-compose 3.打开Docke ...
- scrapy中间件中发送邮件
背景介绍:之前写过通过通过scrapy的扩展发送邮件,在爬虫关闭的时候发送邮件.那个时候有个问题就是MailSender对象需要return出去.这次需要在中间件中发送邮件,但是中间件中不能随便使用r ...
- | C语言I作业01
C语言I作业01 标签:18软件 李煦亮 1.1 你对软件工程专业了解是怎样? 对软件工程的了解是从人工智能频繁地出现在各大新闻,新闻报道了许多高校针对人工智能开设了相关课程或者专业,软件工程是开设的 ...
- 源码casino-server剖析(1)--游戏服务的整体架构和实现
前言: 最近研究了一些游戏服务器的架构和实现, github上找了几个开源的实现. 有几个感觉不错, 打算仔细研读一下. 游戏服务器种类繁多, 这边主要是基于状态同步的棋牌类游戏, 适合入门, ^_^ ...
- 怎么用命令行把apk安装到移动设备上?
1.移动设备通过USB连接电脑 2.执行命令adb install [apk文件的路径]
- Sitecore 8.2 安全性第2部分:安全性编辑器和Access Viewer
在Sitecore中使用安全性时,您可以使用两个主要应用程序:安全编辑器和Access Viewer.从表面上看,这些工具看起来很相似,但它们扮演着截然不同的角色.让我们回顾一下每个应用程序以及它们的 ...
- Java学习:线程池
线程池 线程池概念:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 线程池:容器-->集合(ArrayList,Hash ...
- drools -规则语法
文章结构 1. 基础api 2. FACT对象 3. 规则 4. 函数 1. 基础api 在 Drools 当中,规则的编译与运行要通过Drools 提供的各种API 来实现,这些API 总体来讲可以 ...