Thrift的服务器和客户端Python案例

服务器

Thrift提供的常见服务端类型有一下几种:

  • thrift.server.TServer.TSimpleServer 单线程服务器
  • thrift.server.TServer.TThreadedServer 多线程服务器
  • thrift.server.TServer.TThreadPoolServer 线程池服务器
  • thrift.server.TServer.TForkingServer 多进程服务器

我们以线程池服务器为例,其他方式相同。

import sys
sys.path.append('gen-py')  # 增加生成代码的查找包路径

from calculate import Calculate
from base.ttypes import InvalidOperation, Operation

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


class CalculateHandler(Calculate.Iface):
    """被调用方法的具体实现"""
    def ping(self):
        print('ping()')

    def divide(self, num1, num2):
        if num2 == 0:
            raise InvalidOperation(0, 'Cannot divide by 0')
        return num1 / num2

    def calculate(self, work):
        if work.op == Operation.ADD:
            val = work.num1 + work.num2
        elif work.op == Operation.SUBTRACT:
            val = work.num1 - work.num2
        elif work.op == Operation.MULTIPLY:
            val = work.num1 * work.num2
        else:
            raise InvalidOperation(work.op, 'Invalid operation')
        return val


if __name__ == '__main__':
    handler = CalculateHandler()
    processor = Calculate.Processor(handler)
    transport = TSocket.TServerSocket(host='127.0.0.1', port=8888)
    tfactory = TTransport.TBufferedTransportFactory()
    pfactory = TCompactProtocol.TCompactProtocolFactory()

    server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)
    server.serve()
    print('服务器已启动')

客户端

import sys
sys.path.append('gen-py')

from calculate import Calculate
from base.ttypes import InvalidOperation, Operation, Work

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TCompactProtocol


def main():
    transport = TSocket.TSocket('127.0.0.1', 8888)

    # 使用缓存传输
    transport = TTransport.TBufferedTransport(transport)

    # 使用压缩的二进制消息协议
    protocol = TCompactProtocol.TCompactProtocol(transport)

    client = Calculate.Client(protocol)

    # 连接
    transport.open()

    client.ping()
    print('ping()')

    result = client.divide(100, 50)
    print('100/50={}'.format(result))

    try:
        result = client.divide(100, 0)
    except InvalidOperation as e:
        print(e.why)

    work = Work(1, 2, Operation.ADD)
    result = client.calculate(work)
    print('1+2={}'.format(result))

    work = Work(15, 10, Operation.SUBTRACT)
    result = client.calculate(work)
    print('15-10={}'.format(result))

    # 关闭
    transport.close()


if __name__ == '__main__':
    main()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lansonli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值