2 回答
TA贡献1810条经验 获得超5个赞
python的tornado,tornado应该是最简单的基于epoll(或kqueue)的httpserver和httpclient,说白了就是封装了python标准库的socket和select.epoll(或select.kqueue),所以你也可以照着tornado实现一个媲美nginx的httpserver。当然,为了利用好这个基于epoll的的server,你需要在io处搞个回调函数,只有当你这个io结束,才执行回调函数,如果你这个io不结束,你就执行了回调函数(同步的写法),产生的后果当然是阻塞(因为一直在等你的io结束),所以用了epoll,你就需要层层回调,代码肯定很难看的,tornado为了解决这个问题,就加了个装饰器以及利用了python的yield关键字,装饰器的内部实现的函数名字就叫replace_callback,顾名思义,就是替换回调,yield会使函数或方法冻结,相当于你搞了个回调,但看起来像同步的,当然,这个写法也有很不方便的地方,但已经比回调爽多了。
tornado虽然是最简单的基于epoll的httpserver,但坑也非常明显,前面说了,tornado仅仅封装了socket和select.epoll,这就导致,木有python数据库适配器能和tornado无缝对接,只有两种情况下满足其一才能把数据库适配器改造成tornado能用的,第一:这个适配器是纯python的,关键是socket通信是纯python的;第二:这个适配器自带异步,例如psycopg2。可是就算满足了上面的情况,你还得用tornado自带的ioloop和iostream进行封装,相当麻烦。
gevent就不一样了,作为另一个python协程库,里面封装了C,这导致他不是纯python的,无法适用pypy(除非提供cffi接口),gevent的特点是自己搞了个socket和select,通过monkey_patch的方法干掉了python自带的socket和select,从最底层就开始玩epoll,用gevent做聊天室,不用像tornado那样还需写回调函数或yield,只需要调用gevent.event的wait和set方法。
gevent调用数据库远比tornado简单,虽然它对适配器的要求和tornado一样,但不需要你自己写代码封装(或很少的代码)
- 2 回答
- 0 关注
- 791 浏览
添加回答
举报