Python使用Thrift的代码分析
前言
python使用方便,非常易用,第三方库的支持很全面,使用Python开发Thrift程序的步骤也相当简单,首需要需要配置Python及Thrift环境,然后根据thrift文件,由thrift模板生成器自动生成通信接口代码,具体的操作可以参考:http://www.cnblogs.com/jishilei/archive/2012/12/24/2830944.html
python开发thrift,肯定会涉及到server和client,分别来看下:
Server端
Server段需要实现Thrift里面的service方法,也就是自动生成代码中的Iface接口程序
thrift文件中的service方法如下:
service Calculator extends shared.SharedService { void ping(), i32 add(1:i32 num1, 2:i32 num2), i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch), oneway void zip() }
Iface接口(位于gen-py/tutorial/Calculator.py)如下:
class Iface(shared.SharedService.Iface): def ping(self, ): pass def add(self, num1, num2): pass def calculate(self, logid, w): pass def zip(self, ): pass
服务器端首先需要实现Iface接口,然后分别构造Thrift通信所必需的processor、Transport、BufferedTransportFactory、BinaryProtocolFactory等对象,然后构建server对象并启动serve()方法,具体实现代码如下:
handler = CalculatorHandler() processor = Calculator.Processor(handler) transport = TSocket.TServerSocket('localhost',port=9090) tfactory = TTransport.TBufferedTransportFactory() pfactory = TBinaryProtocol.TBinaryProtocolFactory() server = TServer.TSimpleServer(processor, transport, tfactory, pfactory) print 'Starting the server...' server.serve()
如果有需要,你可以构建一个多线程的server程序,具体实现代码可以参考:
server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
#或者:
server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)
Client端
客户端使用Thrift服务的步骤为:创建一个socket对象,将socket对象封装为BinaryProtocol,然后通过BinaryProtocol反序列化编码创建代理客户端,有了client以后及可以执行各种Iface接口方法,具体代码如下:
transport = TSocket.TSocket('localhost',9090) #为了提高性能,使用Buffer封装原生的socket连接 transport = TTransport.TBufferedTransport(transport) protocol = TBinaryProtocol.TBinaryProtocol(transport) client = Calculator.Client(protocol) transport.open() #TODO transport.close()