Python Thriftの例


前言
Appche Thriftは、Facebookが実現する効率的で、複数のプログラミング言語をサポートする遠隔サービス呼び出しの枠組みです.本稿ではPython開発者の立場から、Appche Thriftの構造、開発、使用を簡単に紹介します.
Thrift概要
Thrift network stack
Transport
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
Protocol         , rpc           。
TProtocol     :TJSONProtocol,TSimpleJSONProtocol,TBinaryProtocol,TBinaryPotocolAccelerated,TCompactProtocol。
プロcessor
Processor stream    ,          handler      service。   Processor compiler  ,      service    。
Server
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。

IDLファイル
/*
thrift      
*/
service HelloService {
    string say(1:string msg)
}
定義ファイルを編集した後、次のコマンドを実行して、thriftファイルを作成します.ハローディレクトリを現在のディレクトリに移すことができます.後から呼び出しやすくなります.
thrift -r -gen py hello.thrift
server
# coding: utf-8
"""
thrift_client.py
"""
import socket
import sys
from hello import HelloService
from hello.ttypes import *

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer


class 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 sys
from hello import HelloService

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

try:
    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.py
client - say
server - Received: Hello!

$ python thrift_server.py
Starting thrift server in python...
Received: Hello!
結び目
本論文は単なる例であり、実際のプロジェクトでは、一般的に、zookeeperに基づいてサービスのthrift状態を登録し管理し、serverとclientをさらにパッケージ化し、プロジェクトの各モジュールで起動するのに便利である.
参照
  • Python thrift使用例
  • https://thrift.apache.org/docs/concepts