thrift 中的坑
一、介绍
thrift 的本质是RPC,详细介绍见:
维基百科:thrift
二、python示例
1.client
import sys
import glob
sys.path.append('gen-py')
sys.path.insert(0, glob.glob('../../lib/py/build/lib*')[0])from tutorial import Calculator
from tutorial.ttypes import InvalidOperation, Operation, Workfrom thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocoldef main():# Make sockettransport = TSocket.TSocket('localhost', 9090)# Buffering is critical. Raw sockets are very slowtransport = TTransport.TBufferedTransport(transport)# Wrap in a protocolprotocol = TBinaryProtocol.TBinaryProtocol(transport)# Create a client to use the protocol encoderclient = Calculator.Client(protocol)# Connect!transport.open()client.ping()print('ping()')sum_ = client.add(1, 1)print('1+1=%d' % sum_)work = Work()work.op = Operation.DIVIDEwork.num1 = 1work.num2 = 0try:quotient = client.calculate(1, work)print('Whoa? You know how to divide by zero?')print('FYI the answer is %d' % quotient)except InvalidOperation as e:print('InvalidOperation: %r' % e)work.op = Operation.SUBTRACTwork.num1 = 15work.num2 = 10diff = client.calculate(1, work)print('15-10=%d' % diff)log = client.getStruct(1)print('Check log: %s' % log.value)# Close!transport.close()
2.Server
import glob
import sys
sys.path.append('gen-py')
sys.path.insert(0, glob.glob('../../lib/py/build/lib*')[0])from tutorial import Calculator
from tutorial.ttypes import InvalidOperation, Operationfrom shared.ttypes import SharedStructfrom thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServerclass CalculatorHandler:def __init__(self):self.log = {}def ping(self):print('ping()')def add(self, n1, n2):print('add(%d,%d)' % (n1, n2))return n1 + n2def calculate(self, logid, work):print('calculate(%d, %r)' % (logid, work))if work.op == Operation.ADD:val = work.num1 + work.num2elif work.op == Operation.SUBTRACT:val = work.num1 - work.num2elif work.op == Operation.MULTIPLY:val = work.num1 * work.num2elif work.op == Operation.DIVIDE:if work.num2 == 0:x = InvalidOperation()x.whatOp = work.opx.why = 'Cannot divide by 0'raise xval = work.num1 / work.num2else:x = InvalidOperation()x.whatOp = work.opx.why = 'Invalid operation'raise xlog = SharedStruct()log.key = logidlog.value = '%d' % (val)self.log[logid] = logreturn valdef getStruct(self, key):print('getStruct(%d)' % (key))return self.log[key]def zip(self):print('zip()')if __name__ == '__main__':handler = CalculatorHandler()processor = Calculator.Processor(handler)transport = TSocket.TServerSocket(host='127.0.0.1', port=9090)tfactory = TTransport.TBufferedTransportFactory()pfactory = TBinaryProtocol.TBinaryProtocolFactory()server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)# You could do one of these for a multithreaded server# server = TServer.TThreadedServer(# processor, transport, tfactory, pfactory)
三、注意事项
对于测试官网给的demo已经足够了。但实际情况测试发现会出现卡死的情况,通过两种方式解决:
1. 改用多线程的server:
server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
2. 二进制传输协议改成完整的协议
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
改为TCompactProtocol.TCompactProtocolFactory()
参考:
http://thrift.apache.org/tutorial/py
thrift 中的坑相关推荐
- (四)Asp.net web api中的坑-【api的返回值】
(四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...
- JDK中的坑:JDK中这些方法的bug你不要踩
点击关注公众号,Java干货及时送达 图片来源:白夜追凶 前言: jdk作为我们每天必备的调用类库,里面大量提供了基础类供我们使用.可以说离开jdk,我们的java代码寸步难行,jdk带给我们的便利可 ...
- C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...
- 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:
决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizerimport csvfrom ...
- Thrift中实现Java与Python的RPC互相调用
场景 Thrift介绍以及Java中使用Thrift实现RPC示例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086894 ...
- 小心 Enum Parse 中的坑
小心 Enum Parse 中的坑 Intro 最近使用枚举的时候,踩了一个小坑,分享一下,主要是枚举从 int 值转成枚举时可能会遇到 Sample 来看下面的示例: 首先定义一个枚举: publi ...
- mysql 主从 通俗易懂_MySQL 主从同步架构中你不知道的“坑”(完结篇)
MySQL 主从同步架构中你不知道的"坑"(完结篇) 收录于话题 #MySQL从入门到放弃 26个 点击上方蓝字,关注我们哟! 前言导读 之前写出一篇文章也是关于这个主从同步架构的 ...
- golang中container/list包中的坑
转载地址:golang中container/list包中的坑 - Go语言中文网 - Golang中文社区 golang中list包用法可以参看golang中container/list包用法_che ...
- 问题 | golang编程中的坑
文章目录 背景 坑一:遍历遇上指针 例子1: 例子2: 为什么? 解决方案 坑二:切片和闭包 例子 为什么 解决方案 坑三:切片的append 例子 为什么 解决方案 坑四:time包自定义格式的坑 ...
最新文章
- 再记一次 应用服务器 CPU 暴高事故分析
- node 测试生成模拟用户数据
- 论文浅尝 - ICML2020 | 通过关系图上的贝叶斯元学习进行少样本关系提取
- 微服务技术栈:API网关中心,落地实现方案
- 前端开发面试题收集(html部分)
- 前端:HTML/05/lt;meta标记,XHTML简介及其编写规范,表格标签(lt;table)及其相关标签(lt;tr,lt;td或lt;th)
- 【华为云技术分享】ARMv8-A存储模型概述(1)
- Java学习笔记2.5.1 循环结构 - 条件循环
- Python保存任意长度的matplotlib动画为GIF动图
- nyoj 1321信息战(九)——水淹七军(搜索bfs)
- java 索引实现,Java创建ES索引实现
- 小白python语言基础
- c51单片机音乐盒c语言,毕业论文-基于AT89C51单片机的音乐盒设计(C程序).doc
- springboot项目启动类报错
- 程序设计c语言作业章春芳,C语言说课PPT
- 线性代数之矩阵逆的求法
- 【NiosII训练】第二篇、FPGA驱动AD9854高级篇
- 找回丢失的QQ之普及知识全套
- 微信小程序 - 实现搜索界面(带热搜、搜索历史和结果页)
- excel实现自动排序