ホームページ > バックエンド開発 > Python チュートリアル > Python での Thrift サンプルコード共有の詳細な説明

Python での Thrift サンプルコード共有の詳細な説明

黄舟
リリース: 2017-05-07 10:40:59
オリジナル
3381 人が閲覧しました


前書き

Apache Thrift は、Facebook によって実装された効率的なフレームワークで、複数のプログラミング言語でのリモート サービス呼び出しをサポートします。この記事では、Python 開発者の観点から、Apache Thrift のアーキテクチャ、開発、使用について簡単に紹介します。

Thriftの紹介

Thriftネットワークスタック

トランスポート

Transport网络读写(socket,http等)抽象,用于和其他thrift组件解耦。
Transport的接口包括:open, close, read, write, flush, isOpen, readAll。
Server端需要ServerTransport(对监听socket的一种抽象),用于接收客户端连接,接口包括:listen, accept, close。
python中Transport的实现包括:TSocket, THttpServer, TSSLSocket, TTwisted, TZlibTransport,都是对某种协议或框架的实现。还有两个装饰器,用于为已有的Transport添加功能,TBufferedTransport(增加缓冲)和TFramedTransport(添加帧)。
在创建server时,传入的时Tranport的工厂,这些Factory包括:TTransportFactoryBase(没有任何修饰,直接返回),TBufferedTransportFactory(返回带缓冲的Transport)和TFramedTransportFactory(返回帧定位的Transport)。
ログイン後にコピー

プロトコル

Protocol用于对数据格式抽象,在rpc调用时序列化请求和响应。
TProtocol的实现包括:TJSONProtocol,TSimpleJSONProtocol,TBinaryProtocol,TBinaryPotocolAccelerated,TCompactProtocol。
ログイン後にコピー

プロセッサ

Processor对stream读写抽象,最终会调用用户编写的handler已响应对应的service。
具体的Processor有compiler生成,用户需要实现service的实现类。
ログイン後にコピー

サーバー

Server创建Transport,输入、输出的Protocol,以及响应service的handler,监听到client的请求然后委托给processor处理。
TServer是基类,构造函数的参数包括:
1) processor, serverTransport
2) processor, serverTransport, transportFactory, protocolFactory
3) processor, serverTransport, inputTransportFactory, outputTransportFactory, inputProtocolFactory, outputProtocolFactory   
TServer内部实际上需要3)所列的参数,1)和2)会导致对应的参数使用默认值。
TServer的子类包括:TSimpleServer, TThreadedServer, TThreadPoolServer, TForkingServer, THttpServer, TNonblockingServer, TProcessPoolServer
TServer的serve方法用于开始服务,接收client的请求。
ログイン後にコピー

コード生成

constants.py: 包含声明的所有常量
ttypes.py: 声明的struct,实现了具体的序列化和反序列化
SERVICE_NAME.py: 对应service的描述文件,包含了:
    Iface: service接口定义
    Client: client的rpc调用桩
ログイン後にコピー

使用法

Thrift的用法实际上很简单,定义好IDL,然后实现service对应的handler(方法名、参数列表与接口定义一致接口),最后就是选择各个组件。需要选择的包括:Transport(一般都是socket,只是十分需要选择buffed和framed装饰器factory),Protocol,Server。
ログイン後にコピー

ファイルをDLしました

/*
thrift接口定义文件
*/service HelloService {    string say(1:string msg)
}
ログイン後にコピー

定義を編集した後file で、次のコマンドを実行して thrift ファイルを生成します。 hello ディレクトリは、後で簡単に呼び出せるように現在のディレクトリに移動できます。

thrift -r -gen py hello.thrift
ログイン後にコピー

server

# coding: utf-8"""
thrift_client.py
"""import socketimport sysfrom hello import HelloServicefrom hello.ttypes import *from thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocolfrom thrift.server import TServerclass HelloServiceHandler:
    def say(self, msg):
        ret = "Received: " + msg        print ret        return ret


handler = HelloServiceHandler()
processor = HelloService.Processor(handler)
transport = TSocket.TServerSocket("localhost", 9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)print "Starting thrift server in python..."server.serve()print "done!"
ログイン後にコピー

client

# coding: utf-8"""
thrift_client.py
"""import sysfrom hello import HelloServicefrom thrift import Thriftfrom thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocoltry:
    transport = TSocket.TSocket('localhost', 9090)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = HelloService.Client(protocol)
    transport.open()    print "client - say"
    msg = client.say("Hello!")    print "server - " + msg

    transport.close()except Thrift.TException, ex:    print "%s" % (ex.message)
ログイン後にコピー

実行結果

$ ptyhon thrift_client.pyclient - say
server - Received: Hello!

$ python thrift_server.pyStarting thrift server in python...Received: Hello!
ログイン後にコピー

概要

この記事は単なる例にすぎません。実際のプロジェクトでは、一般にzookeeperはサービスの節約ステータスの登録と管理に使用されます。カプセル化により、プロジェクトのさまざまなモジュールを簡単に呼び出すことができます。

以上がPython での Thrift サンプルコード共有の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート