前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Thrift的服务器和客户端Python案例

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

作者头像
Lansonli
发布于 2021-10-09 07:52:52
发布于 2021-10-09 07:52:52
1.4K00
代码可运行
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客
运行总次数:0
代码可运行

服务器

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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('服务器已启动')

客户端

代码语言:javascript
代码运行次数:0
运行
复制
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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【前端】JavaScript 变量声明与函数提升例题分析:深入理解变量提升、作用域链与函数调用
在 JavaScript 执行代码之前,会先进行 预解析 ,把变量和函数声明提升到当前作用域的顶部。在这段代码中,我们有两个作用域需要考虑: 全局作用域 和 函数作用域 fn 。
CSDN-Z
2024/11/26
1210
【前端】JavaScript 变量声明与函数提升例题分析:深入理解变量提升、作用域链与函数调用
《你不知道的JavaScript》:作用域提升
所谓声明,包括变量声明和函数声明。而声明提升,就是在作用域范围内,不管内部的变量与函数声明在何处,当执行到这个作用域时,引擎都会首先将当前作用域内的变量和函数声明放置到当前作用域顶端后,再按从上到下顺序执行其他代码。举例:
前端_AWhile
2019/08/29
6460
前端基础-JavaScript作用域与JS代码的运行
变量的作用域是在定义时决定而不是执行时决定的,也就是说词法作用域取决于编译阶段,通过静态分析就能确定,因此词法作用域也叫做静态作用域。
cwl_java
2020/03/26
1.3K0
JavaScript——作用域
通常来说,一段程序代码中所用到的名字并不是总有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域,作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
岳泽以
2022/10/26
4090
深入理解Javacript从作用域作用域链开始
作用域是你的代码在运行时,某些特定部分中的变量,函数和对象的可访问性。换句话说,作用域决定了变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
coder_koala
2019/07/30
5450
深入理解Javacript从作用域作用域链开始
JavaScript 中的作用域和声明提升
猜猜弹框中会输出 ‘Hello’ 还是 ‘World’。揭晓答案: ‘undefined’。这里是一个 JavaScript 的小陷阱–JavaScript 变量提升(Hoisting)。
李振
2021/11/26
5890
深入理解JavaScript作用域
在上一篇文章 深入理解JavaScript 执行上下文 中提到 只有理解了执行上下文,才能更好地理解 JavaScript 语言本身,比如变量提升,作用域,闭包等,本篇文章就来说一下 JavaScript 的作用域。
木子星兮
2020/07/27
7350
深入理解JavaScript作用域
「JavaScript」作用域与对象
请注意,本文编写于 2098 天前,最后修改于 174 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
4440
「JavaScript」作用域与对象
函数与作用域
1.函数声明和函数表达式有什么区别 函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 JavaScript有三种方法,可以声明一个函数。 1.function命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面传入函数的参数。函数体放在大括号里面。 function add(s) { console.log(s) } 上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应
小胖
2018/06/27
8700
JavaScript 面试要点:作用域和闭包
在当前的作用域中找不到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到 或 到达最外层作用域(全局作用域)为止。
Cellinlab
2023/05/17
4810
JavaScript 面试要点:作用域和闭包
java作用域-我是这样理解JavaScript中作用域
  学习任何一门编程语言,对于作用域的认知都是必要。因为作用域会影响标识符的定义以及生命周期。感觉没有说服力,太苍白了话不多说,接下来一起学习吧~
宜轩
2022/12/29
4260
js函数、作用域和闭包
2.1 用function命令声明函数 function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数,函数体放在大括号里面
bamboo
2019/01/29
1.5K0
js函数、作用域和闭包
JavaScript中的作用域和作用域链
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。可能这两句话并不好理解,我们先来看个例子:
刘亦枫
2020/03/19
2.4K0
JavaScript中的作用域和作用域链
理解JavaScript的作用域
当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。作用域嵌套的查询规则:
4O4
2022/04/25
7390
JavaScript 作用域和作用域链
作用域就是变量与函数的可访问范围。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
零式的天空
2022/03/02
1.8K0
前端学习(34)~js学习(十一):作用域和变量提升
作用域:通俗来讲,作用域是一个变量或函数的作用范围。作用域在函数定义时,就已经确定了。
Vincent-yuan
2020/03/18
7730
JavaScript的预编译过程
在全局环境中会生成一个 GO对象 (Global Object),还是按照上面的四步执行。
FinGet
2019/06/28
4150
JavaScript的预编译过程
apply/call/bind、作用域/闭包、this指向(普通,箭头,JS/Vue的this)
这里要跟this指向区分开。(这里说的作用域先简单理解为,只是变量的作用域,跟this没关系)
用户4396583
2024/10/08
1540
JS进阶-作用域
定义:局部作用域的意思就是,变量只能在它的代码块或者函数内部访问,而不能在外部访问,局部作用域的变量在函数或代码块执行完后会销毁,不会影响全局作用域变量。
吃猫的鱼Code
2025/02/11
2020
作用域和闭包
几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个值进行访问或修改。事实上,正是这种储存和访问变量的值的能力将状态带给了程序。
Cellinlab
2023/05/17
7850
作用域和闭包
相关推荐
【前端】JavaScript 变量声明与函数提升例题分析:深入理解变量提升、作用域链与函数调用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档