最近的一个项目中用的是zeromq,所以考察了下基于zeromq的rpc,方便项目中使用。貌似现在最流行的是zerorpc,首先名字就起的好,其次是dotcloud的出的,还是有保障的,可惜用的gevent,而我的项目中用的tornado,据以前的经验,在tornado的事件循环中夹杂别的poller可能会悲剧,所以也不敢用,于是今天就花了点时间写了一个. 代码比较简短,但基本的框架是有的.

有几个地方时需要注意的,代码中的Client提供了standalone和非standalone两个模式,因为rpc在做异步的时候用的也是当前线程的loop,而在rpc阻塞调用返回时,需要直接返回数据,所以在set_result的时候会stop掉loop,如果是standalone的话,这样是没有问题的,但如果集成到系统中的话,会停掉server,所以在非standalone模式中,在每个future调用get获取结果之后会手动保证loop是running的,虽然很丑陋,不过算是很简单的做法了.

今天看了下gevent,这样的异步框架机制都是那一套,在gevent.core 中提供的run_callback,io,timer对应tornado中的add_callback,add_handler,add_timeout,这三种机制基本就可以对应iobound应用的需求了,其他的什么period在这上面包装就行了,不过gevent构建在greenlet上还是占有先天的优势的,tornado虽然提供了generator方案,但python2.x中的这种sbyield就算了,gevent还是用了最简单省事的办法,一个hub管理所有的greenlet,调度什么的都放在里面,greenlet sleep的时候switch到hub就行,加上它自己也提供了queue,event等一些周边工具,总体来说,gevent的确很不错,推荐!!!不过我对gevent monkey_patch这种侵入式的方式持保留态度,我认为也是gevent的一个瑕疵吧!