文档章节

ToRPC:一个双向RPC的Python实现

toil
 toil
发布于 2015/11/07 13:38
字数 950
阅读 2072
收藏 27

简介

ToRPC(Tornado + RPC) 是一个的基于Tornado IOLoop的异步TCP和双向通信的RPC的Python实现。ToRPC非常轻量级,性能优秀(尤其是在PyPy环境下)。

特性

  • 异步 tcp 通信
  • 异步、双向 rpc

地址:https://github.com/yoki123/torpc

背景

在Python中,消息队列、RPC框架都有很多,很多框架的完成度和稳定性都不错了,但是速度却不尽人意(真的就是慢),于是产生了造一个轮子的想法————一款可以压榨服务器资源的RPC框架。

对比多款框架后,发现了A fast MessagePack RPC library,它是基于Cython、Gevent、MsgPack完成的一款,它的简洁和高性能吸引了我,再使用过程中,我试图再优化的时候,发现基本上已经达到CPU和网络I/O的瓶颈。

因为使用Cython和gevent,后者底层也是C语言实现的,那么CPU消耗是没有的办法的时候,将MsgPack换成速度更快的marshal速度提升了10%左右,但是流量随之增加了,最后还要考虑marshal跨版本时的兼容问题(ToRPC目前也是marshal)。

既然达到瓶颈了,试试别的框架吧,后来又找到了echo servers in many languages。 根据这个代码,Python部分的Echo servers的性能顺序是这样的:

  1. pypy+tornado
  2. python+gevent(无greenlet)
  3. python+tornado
  4. python+gevent
  5. pypy+twisted

结论是pypy配合event-driven的tornado性能最好,它的速度和Golang(1.5)及C++ + epoll更接近。而我自己又在pypy下测试了的tornado、twisted、eventlet,还是tornado最快。最后的抉择是使用tornado,思路是单进程、纯异步(这不就是nodejs么)。

简化Tornado的IOStream

在tornado下的rpc服务器已经有msgpack-rpc-python, 而比较server_tornado.pyserver_tornado_iostream.py之后,发现IOStream非常影响性能。而且msgpack-rpc-python正好使用了IOStream,并且不支持双向RPC。 好吧,是时候去简化IOStream了。一开始将IOStream中的_read_buffer_write_buffercollections.deque()换成Queue之后,性能却更差了。 索性还是不换了,直接撸纯event-driven,简化大量API之后,新的轮子比自带IOStream在效率上还是有很大的提升。

双向RPC支持

ToRPC主要的特色是支持双向的RPC,client可以调用server的同时也可以使用server调用client。 最后为了让多个client之间相互调用而不需要开多个RPC服务器,引入了一个RPC服务注册的机制,实现了任何两个RPC client可以通过RPC server中转实现RPC调用,当然这样会让RPC server的负担更重了。双向RPC的使用方法在examples文件夹中。

ToRPC的使用

ToRPC支持在RPC、TCP应用中使用callback方式,同样也支持返回Future,这使得Tornado中concurrent的方式可以在ToRPC中使用。

from torpc import RPCClient

def result_callback(f):
    print(f.result())

@gen.coroutine
def using_gen_style():
    want_to_say = 'way to explore'
    ret = yield rc.call('echo', want_to_say)
    assert ret == want_to_say
    print('gen_style complete')

rc = RPCClient(('127.0.0.1', 5000))
rc.call('echo', 'hello world', callback=result_callback)
future = rc.call('echo', 'code for fun')
future.add_done_callback(result_callback)
using_gen_style()

性能

系统: CentOS 6.6 x64<br/> 处理器: Intel i5-3470 3.20GHz<br/> 内存: 8 GB 1600 MHz DDR3

性能

到目前来看,ToRPC虽然是东拼西凑的一个轮子,但是它的性能是有目共睹的,尤其是在PyPy环境下。

msgpack-rpc-pythonmprpc的结果可以从下方链接进入。

参考项目

最后,ToRPC仍有很多很多不足的地方,如果发现问题或者有好的想法可以提issue或者提交pull Requestsexamples文件夹下有使用方法。

© 著作权归作者所有

toil

toil

粉丝 63
博文 11
码字总数 11194
作品 1
程序员
私信 提问
加载中

评论(3)

toil
toil 博主

引用来自“yujixi123”的评论

骨灰盒哈
什么意思?
y
yujixi123
骨灰盒哈
小薇
小薇
感觉不错…
RPC 的 Python 实现--ToRPC

ToRPC(Tornado + RPC) 是一个的基于 TornadoIOLoop 的异步TCP和双向通信的RPC的Python实现。ToRPC非常轻量级,性能优秀(尤其是在PyPy环境下)。 注意:目前为止,ToRPC只在CPython 2.7+和P...

toil
2015/11/16
3.6K
1
gRPC双向数据流的交互控制(go语言实现)

gRPC简介 gRPC (https://grpc.io) 是一个由Google开发的高性能、开源、跨多种编程语言和通用的远程过程调用协议(RPC) 框架,用于客户端和服务器端之间的通信,使用HTTP/2协议并将 ProtoBuf (...

阿狸不歌
2018/05/08
0
0
gRPC 1.11.0 发布,Google 高性能 RPC 框架

gRPC 1.11.0 发布了,gRPC-java 是谷歌 RPC 框架 gRPC 的 Java 实现。 gRPC 是一个高性能、开源、通用的 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RP...

周其
2018/04/14
2.2K
4
gRPC 1.8.2 发布,Google 高性能 RPC 框架

gRPC 1.8.2 已发布,该版本主要是修复 bug,具体如下: 修复 Python 版本中 100% 的 CPU 使用率 (#9688) 下载地址 Source code (zip) Source code (tar.gz) gRPC 是一个高性能、开源、通用的...

局长
2017/12/21
1K
5
grpc 1.18.0 发布,谷歌开源的高性能 RPC 框架

grpc 1.18.0 发布了。gRPC 是 Google 开源的高性能、通用 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架。gRPC 基于 HTTP/2 标准设计,带来诸如双...

段段段落
01/16
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript权威指南笔记14

第14章、window对象 1、计时器 I-1 setTimeout()和setInterval()可在指定时间后调用 setTimeout()返回值可传递给clearTimeout()用于取消该函数的执行。 多久后执行。 setInterval()指定时间间...

_Somuns
7分钟前
0
0
python3.7安装教程

原创 python3.7安装教程 2018-09-18 21:10:56 PtaQ 阅读数 20628更多 分类专栏: python 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文...

_纵横捭阖_
20分钟前
2
0
windows使用docker运行mysql等工具(二)安装运行mysql

今天接着上一篇的内容继续来学习安装运行mysql。建议先阅读第一篇:windows安装docker 一 查看mysql版本 如果想知道mysql镜像具体有哪几个版本,需要去docker hub查看。 地址如下: https://...

执偕
30分钟前
1
0
IT兄弟连 HTML5教程 CSS3属性特效 文字排版

direction定义文字排列方式,所有浏览器都兼容这个属性,有两个可选值rtl和ltr。文字排版的参数说明如表1所示。 表1 CSS3文字排版参数说明 上表所示,ltr是初始值,表示left-to-right,就是从...

老码农的一亩三分地
30分钟前
1
0
做好一名linux运维工程师

如何做好一个合格的运工程师,运维工程师前景怎么样呢?就这些问题,与大家交流一下。首先对于运维工程师的要求是十分严苛的了,运维工程师不但要针对不同的问题做出响应,而且需要不断的补充...

问题终结者
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部