`
younglibin
  • 浏览: 1213835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用python实现thrift异步client(tornado和twisted)

 
阅读更多

thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现

    twisted:         Generate Twisted-friendly RPC services.

    tornado:         Generate code for use with Tornado.

  在使用tornado的使用,thrift0.9.1这个版本  生成的tornado python文件 和 最新版的  tornado 目录结构有变化,

导致引用的 类找不到,又考虑到如果有版本升级问题,所以放弃修改tornado或者使用低版本tornado,目前改为使用twisted。

 

1.首先 ,thrift  中 生产python文件默认是没有asybcClient这样接口的所有,查看帮组之后使用

thrift -gen py:tornado -out ./ hello.throft 

  子生成文件中我们可以看到Iface 中有很多  callback  的 回调函数

2.创建 异步client

 25     transport = TSocket.TSocket("192.168.1.105", 7911)
 26     transport = TTransport.TFramedTransport(transport)
 27     protocol = TJSONProtocol.TJSONProtocolFactory()
 28     transport.open()
 29     client = Hello.Client(transport, protocol)
 30     client.helloString("sad", callback)

 

3.异步回调函数:

/home/libin/software/thrift/thrift-0.9.1/tutorial/py.tornado/PythonClient.py

22 import sys
 23 import glob
 24 sys.path.append('gen-py.tornado')
 25 sys.path.insert(0, glob.glob('../../lib/py/build/lib.*')[0])
 26 
 27 import logging
 28 
 29 from tutorial import Calculator
 30 from tutorial.ttypes import Operation, Work, InvalidOperation
 31 
 32 from thrift import TTornado
 33 from thrift.transport import TSocket
 34 from thrift.transport import TTransport
 35 from thrift.protocol import TBinaryProtocol
 36 
 37 from tornado import gen
 38 from tornado import ioloop
 39 
 40 
 41 @gen.engine
 42 def communicate(callback=None):
 43     # create client
 44     transport = TTornado.TTornadoStreamTransport('localhost', 9090)
 45     pfactory = TBinaryProtocol.TBinaryProtocolFactory()
 46     client = Calculator.Client(transport, pfactory)
 47 
 48     # open the transport, bail on error
 49     try:
 50         yield gen.Task(transport.open)
 51     except TTransport.TTransportException as ex:
 52         logging.error(ex)
 53         if callback:
 54             callback()
 55         return
 56 
 57     # ping
 58     yield gen.Task(client.ping)
 59     print "ping()"
 60 
 61     # add
 62     sum_ = yield gen.Task(client.add, 1, 1)
 63     print "1 + 1 = {}".format(sum_)
 64 
 65     # make a oneway call without a callback (schedule the write and continue
 66     # without blocking)
 67     client.zip()
 68     print "zip() without callback"
 69 
 70     # make a oneway call with a callback (we'll wait for the stream write to
 71     # complete before continuing)
 72     yield gen.Task(client.zip)
 73     print "zip() with callback"
 74 
 75     # calculate 1/0
 76     work = Work()
 77     work.op = Operation.DIVIDE
 78     work.num1 = 1
 79     work.num2 = 0
 80 
 81     try:
 82         quotient = yield gen.Task(client.calculate, 1, work)
 83         print "Whoa? You know how to divide by zero?"
 84     except InvalidOperation as io:
 85         print "InvalidOperation: {}".format(io)
 86 
 87     # calculate 15-10
 88     work.op = Operation.SUBTRACT
 89     work.num1 = 15
 90     work.num2 = 10
 91 
 92     diff = yield gen.Task(client.calculate, 1, work)
 93     print "15 - 10 = {}".format(diff)
 94 
 95     # getStruct
 96     log = yield gen.Task(client.getStruct, 1)
 97     print "Check log: {}".format(log.value)
 98 
 99     # close the transport
100     client._transport.close()
101 
102     if callback:
103         callback()
104 
105 
106 def main():
107     # create an ioloop, do the above, then stop
108     io_loop = ioloop.IOLoop.instance()
109     def this_joint():
110         communicate(callback=io_loop.stop)
111     io_loop.add_callback(this_joint)
112     io_loop.start()
113 
114 
115 if __name__ == "__main__":
116     main()
                                   

 

 

使用 twisted:

thrift -gen py:twisted -out ./ hello.throft 

客户端代码:

 

 22 import sys, glob
 23 sys.path.append('gen-py.twisted')
 24 sys.path.insert(0, glob.glob('../../lib/py/build/lib.*')[0])
 25 
 26 from tutorial import Calculator
 27 from tutorial.ttypes import *
 28 
 29 from twisted.internet.defer import inlineCallbacks
 30 from twisted.internet import reactor
 31 from twisted.internet.protocol import ClientCreator
 32 
 33 from thrift import Thrift
 34 from thrift.transport import TTwisted
 35 from thrift.protocol import TBinaryProtocol
 36 
 37 @inlineCallbacks
 38 def main(client):
 39   yield client.ping()
 40   print 'ping()'
 41 
 42   sum = yield client.add(1,1)
 43   print '1+1=%d' % (sum)
 44 
 45   work = Work()
 46 
 47   work.op = Operation.DIVIDE
 48   work.num1 = 1
 49   work.num2 = 0
 50 
 51   try:
 52     quotient = yield client.calculate(1, work)
 53     print 'Whoa? You know how to divide by zero?'
 54   except InvalidOperation, io:
 55     print 'InvalidOperation: %r' % io
 56 
 57   work.op = Operation.SUBTRACT
 58   work.num1 = 15
 59   work.num2 = 10
 60 
 61   diff = yield client.calculate(1, work)
 62   print '15-10=%d' % (diff)
 63 
 64   log = yield client.getStruct(1)
 65   print 'Check log: %s' % (log.value)
 66   reactor.stop()
 67 
 68 if __name__ == '__main__':
 69     d = ClientCreator(reactor,
 70                       TTwisted.ThriftClientProtocol,
 71                       Calculator.Client,
 72                       TBinaryProtocol.TBinaryProtocolFactory(),
 73                       ).connectTCP("127.0.0.1", 9090)
 74     d.addCallback(lambda conn: conn.client)
 75     d.addCallback(main)
 76 
 77     reactor.run()

 

分享到:
评论

相关推荐

    python通过thrift访问hbase.docx

    "Python 通过 Thrift 访问 HBase" 在大数据时代,HBase 作为一个...在这个示例中,我们使用 Python 通过 Thrift 访问 HBase,实现了高效的数据交换和存储。这种方式可以广泛应用于大数据时代的数据存储和处理中。

    python thrift2 connect hbase

    在Python中使用Thrift2连接HBase,首先需要安装thrift库,可以使用pip命令进行安装: ``` pip install thrift ``` 接着,你需要下载HBase的Thrift IDL文件(通常为hbase.thrift),这个文件定义了HBase服务的所有...

    thrift 的 java 和 python结合例子

    在这个"thrift的java和python结合例子"中,我们将探讨如何使用Thrift在Java和Python之间建立通信。 首先,Thrift通过定义接口描述文件(.thrift)来规范服务的接口。这个文件使用Thrift IDL(Interface Description...

    Thrift中实现Java与Python的RPC互相调用示例代码.rar

    在本示例中,我们将探讨如何使用Thrift在Java和Python之间实现RPC(Remote Procedure Call)的互相调用。 首先,我们需要了解Thrift IDL。在Thrift IDL文件中,我们可以定义服务接口、数据结构(如struct)和常量。...

    qt 实现thrift的一个例子

    在`cpp-thrift-uploadImage-client`目录中,应该包含了客户端的代码,包括Qt网络组件的使用和Thrift客户端的实例化。而在`cpp-thrift-uploadImage-server`目录下,你会看到服务端的代码,包括服务器的启动、连接处理...

    unity3d thrift twisted

    标题 "unity3d thrift twisted" 暗示了这个项目是关于使用Unity3D游戏引擎与Thrift(一种跨语言的远程过程调用框架)以及Twisted(一个Python的网络编程库)进行集成开发的。这涉及到多个技术栈的融合,主要集中在...

    PyPI 官网下载 | thrift_amqp_tornado-0.0.2.tar.gz

    AMQP(Advanced Message Queuing Protocol)是一种开放标准的消息协议,常用于实现异步消息传递和队列服务。它被广泛应用于微服务架构中,用于解耦应用程序,提高系统的可靠性和可扩展性。 Tornado是Python的一个...

    flume通过thrift协议收集日志-Python

    在本场景中,我们关注的是如何使用 Python 与 Flume 通过 Thrift 协议来实现日志收集。Thrift 是一个跨语言的服务框架,它允许在不同的编程语言之间进行高效的数据序列化和通信。 首先,我们需要了解 Flume 的基本...

    maven-thrift-client

    【 Maven 和 Thrift 的结合:maven-thrift-client】 在软件开发中,Thrift 是一个强大的跨语言服务开发框架,由 Facebook 开发并开源。它允许开发者定义服务接口和服务数据类型,然后自动生成多种编程语言的客户端...

    php_thrift_python安装测试记录

    本篇文章将围绕“php_thrift_python安装测试记录”这一主题,深入探讨如何在PHP中使用Thrift客户端调用Python服务端,并分享相关的安装步骤和代码示例。 首先,我们来看Thrift的基本工作原理。Thrift通过一种中间...

    hbase thrift python

    标题 "hbase thrift python" 和描述 "hbase thrift python gen-py" 提供了关于一个使用HBase、Thrift和Python进行数据交互的场景。在这个主题下,我们将深入探讨这三者之间的关系以及如何在实际操作中应用它们。 **...

    Python3通过thrift连接hbase库_修改版,个人已验证

    python3通过thrift连接hbase模块修改版,其中hbase-python3,里面的path,根据实际实际路径修改.

    Python库 | thrift_pyi-0.2.0-py3-none-any.whl

    Python库Thrift PyI是Apache Thrift在Python中的一个实现,它主要负责处理跨语言的服务定义、编译器以及客户端和服务端的运行时框架。这个压缩包“thrift_pyi-0.2.0-py3-none-any.whl”是一个预编译的Python wheel...

    python3使用thrift操作hbase hbase-thirft报错解决

    python连接hbase需要用到hbase-thirft类库,但是hbase-thirft只在python2下能正常使用,如果在python3下,会报错...这几个都是python3和python2语法不兼容导致的,下载的包已经把这些错误结果了,在python下能正常使用

    Thrift--JSClient

    5. **跨平台通信**:可能涉及如何在Web应用中使用Thrift JSClient与后端服务(可能是Java、Python或其他语言)进行通信。 6. **示例代码**:通常会提供实际的JavaScript代码片段,展示如何创建Thrift客户端对象,...

    Python库 | ctec_thrift_client_py3-1.0.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:ctec_thrift_client_py3-1.0.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    python实现的RPC例子

    在这个例子中,我们将深入探讨如何使用Python实现RPC,特别关注Thrift库,这是一个跨语言的服务开发框架。 Thrift是由Facebook开发的开源框架,它允许创建高效的、可扩展的、跨语言的服务。Thrift通过定义一种中间...

    thrift的使用介绍

    一旦有了IDL文件,你可以使用Thrift编译器生成对应语言的客户端和服务器端代码。例如,对于PHP和Python,这将生成服务接口类、协议处理类以及数据结构的序列化和反序列化代码。 - `PhpClient.php`: 这是生成的PHP...

    python3 使用 thrift 操作hbase 安装hbase-thirft后有一个Hbase报错

    python3 使用 thrift 操作hbase 安装hbase-thirft后有一个Hbase报错 使用这个修改完成的Hbase类替换掉原来的Hbase类问题全部解决 主要是因为python版本兼容性带来的问题

Global site tag (gtag.js) - Google Analytics