一、介绍

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 中的坑相关推荐

  1. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  2. JDK中的坑:JDK中这些方法的bug你不要踩

    点击关注公众号,Java干货及时送达 图片来源:白夜追凶 前言: jdk作为我们每天必备的调用类库,里面大量提供了基础类供我们使用.可以说离开jdk,我们的java代码寸步难行,jdk带给我们的便利可 ...

  3. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...

  4. 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:

    决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizerimport csvfrom ...

  5. Thrift中实现Java与Python的RPC互相调用

    场景 Thrift介绍以及Java中使用Thrift实现RPC示例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086894 ...

  6. 小心 Enum Parse 中的坑

    小心 Enum Parse 中的坑 Intro 最近使用枚举的时候,踩了一个小坑,分享一下,主要是枚举从 int 值转成枚举时可能会遇到 Sample 来看下面的示例: 首先定义一个枚举: publi ...

  7. mysql 主从 通俗易懂_MySQL 主从同步架构中你不知道的“坑”(完结篇)

    MySQL 主从同步架构中你不知道的"坑"(完结篇) 收录于话题 #MySQL从入门到放弃 26个 点击上方蓝字,关注我们哟! 前言导读 之前写出一篇文章也是关于这个主从同步架构的 ...

  8. golang中container/list包中的坑

    转载地址:golang中container/list包中的坑 - Go语言中文网 - Golang中文社区 golang中list包用法可以参看golang中container/list包用法_che ...

  9. 问题 | golang编程中的坑

    文章目录 背景 坑一:遍历遇上指针 例子1: 例子2: 为什么? 解决方案 坑二:切片和闭包 例子 为什么 解决方案 坑三:切片的append 例子 为什么 解决方案 坑四:time包自定义格式的坑 ...

最新文章

  1. 再记一次 应用服务器 CPU 暴高事故分析
  2. node 测试生成模拟用户数据
  3. 论文浅尝 - ICML2020 | 通过关系图上的贝叶斯元学习进行少样本关系提取
  4. 微服务技术栈:API网关中心,落地实现方案
  5. 前端开发面试题收集(html部分)
  6. 前端:HTML/05/lt;meta标记,XHTML简介及其编写规范,表格标签(lt;table)及其相关标签(lt;tr,lt;td或lt;th)
  7. 【华为云技术分享】ARMv8-A存储模型概述(1)
  8. Java学习笔记2.5.1 循环结构 - 条件循环
  9. Python保存任意长度的matplotlib动画为GIF动图
  10. nyoj 1321信息战(九)——水淹七军(搜索bfs)
  11. java 索引实现,Java创建ES索引实现
  12. 小白python语言基础
  13. c51单片机音乐盒c语言,毕业论文-基于AT89C51单片机的音乐盒设计(C程序).doc
  14. springboot项目启动类报错
  15. 程序设计c语言作业章春芳,C语言说课PPT
  16. 线性代数之矩阵逆的求法
  17. 【NiosII训练】第二篇、FPGA驱动AD9854高级篇
  18. 找回丢失的QQ之普及知识全套
  19. 微信小程序 - 实现搜索界面(带热搜、搜索历史和结果页)
  20. excel实现自动排序

热门文章

  1. projectanarchy中 调用Lua 脚本
  2. 伴娘礼服上的年华(八)
  3. nba球员与三国武将
  4. 网页防篡改简析(一)
  5. A1029 Median
  6. 常用网络工具4:SG 宽带工具
  7. python制作恶搞_python—做一个恶搞程序
  8. 医疗器械与知识产权保护
  9. 谷粒商城-个人笔记(高级篇二)
  10. 压缩文件转为gz格式