ToRPC(Tornado + RPC) 是一個的基於Tornado IOLoop的異步TCP和雙向通訊的RPC的Python實現。ToRPC很是輕量級,性能優秀(尤爲是在PyPy環境下)。node
地址:https://github.com/yoki123/torpcpython
在Python中,消息隊列、RPC框架都有不少,不少框架的完成度和穩定性都不錯了,可是速度卻不盡人意(真的就是慢),因而產生了造一個輪子的想法————一款能夠壓榨服務器資源的RPC框架。ios
對比多款框架後,發現了A fast MessagePack RPC library,它是基於Cython、Gevent、MsgPack完成的一款,它的簡潔和高性能吸引了我,再使用過程當中,我試圖再優化的時候,發現基本上已經達到CPU和網絡I/O的瓶頸。git
由於使用Cython和gevent,後者底層也是C語言實現的,那麼CPU消耗是沒有的辦法的時候,將MsgPack換成速度更快的marshal速度提高了10%左右,可是流量隨之增長了,最後還要考慮marshal跨版本時的兼容問題(ToRPC目前也是marshal)。github
既然達到瓶頸了,試試別的框架吧,後來又找到了echo servers in many languages。 根據這個代碼,Python部分的Echo servers的性能順序是這樣的:web
結論是pypy配合event-driven的tornado性能最好,它的速度和Golang(1.5)及C++ + epoll更接近。而我本身又在pypy下測試了的tornado、twisted、eventlet,仍是tornado最快。最後的抉擇是使用tornado,思路是單進程、純異步(這不就是nodejs麼)。服務器
在tornado下的rpc服務器已經有msgpack-rpc-python, 而比較server_tornado.py
和server_tornado_iostream.py
以後,發現IOStream很是影響性能。並且msgpack-rpc-python
正好使用了IOStream,而且不支持雙向RPC。 好吧,是時候去簡化IOStream了。一開始將IOStream中的_read_buffer
和_write_buffer
從collections.deque()
換成Queue
以後,性能卻更差了。 索性仍是不換了,直接擼純event-driven,簡化大量API以後,新的輪子比自帶IOStream在效率上仍是有很大的提高。網絡
ToRPC主要的特點是支持雙向的RPC,client
能夠調用server
的同時也可使用server
調用client
。 最後爲了讓多個client
之間相互調用而不須要開多個RPC服務器,引入了一個RPC服務註冊的機制,實現了任何兩個RPC client
能夠經過RPC server
中轉實現RPC調用,固然這樣會讓RPC server
的負擔更重了。雙向RPC的使用方法在examples文件夾中。框架
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-python
和mprpc
的結果能夠從下方連接進入。
最後,ToRPC仍有不少不少不足的地方,若是發現問題或者有好的想法能夠提issue或者提交pull Requests,examples文件夾下有使用方法。