为什么tornado 和 gevent 组合起来会比原生 tornado 更快?

tornado 不是已经异步了吗, 为什么加上 gevent 后会更快?

提问来自于这篇 blog, 速度测试

阅读 17.2k
6 个回答

猜测是因为gevent是c的模块,而tornado封包重组,HTTP协议解析都是python写的,比如解析HTTP头用的是正则。。。
tornado-over-gevent 中 tornado 运行于 wsgi 模式,HTTP协议解析等工作就由 gevent 完成了。

题主的疑问中,异步不一定就比同步的更快吧,这需要看具体应用场景。

相比较而言,如果不是并发,并且不是针对有阻塞的操作。同步和异步谁更快还不好说。

python 的并发技术中,大致是多线程,多进程,协程。可以参考下这篇文章

tornado 可以异步也可以同步,具体还得看如何使用。

原文说:

从上面结果可能看出Tornado比Flask快很多. 而Gevent可以让Tornado更快一些, 但快不了很多.

我在别的文章里看到过这样的测试结论。既然快不了多少,不如不用。

新手上路,请多包涵

tornaod提供了一个魔术的stackcontext manager来提供对协程的上下文管理,而这个是tornado实现的。而gevent把相同的工作用C完成了。但是两者的效率相差并没有多少。
另外一点值得一提的时候, tornado实际上提供了一个@coroutine的机制,这个让同步的写法也消耗了效率。

听我老大说的, gevent 使用的是 greenlet + epoll, greenlet 自定义了栈, greenlet 有点类似 goroutine, 可以实现并行. tornado只是自已实现了 epoll.

新手上路,请多包涵

快多少得看具体场景的。
tornado虽然是一个异步框架,但是也仅仅是框架而已,他只是实现了get或者post方法相对于返回消息的异步处理,但是毕竟是单进程单线程的,通过一个事件队列来对所有经过了自己事件化的事物做的分片处理,遇到执行一个没有异步化的命令,比如有IO操作的命令(或者耗时的命令),自然框架就无能为力了,虽然他自己实现了一些异步的工具,比如AsyncHttpClient,但是还是太少了,比如访问数据库的网络IO,等待数据库返回数据,向redis请求数据等等,绝大部分关键的操作其实都是包含了blocking的IO操作的。但是gevent可以说实现的比较彻底,他把所有的sock,disk 的IO操作都做了协程化处理,所以结合结合到tornado的异步化框架,效果肯定要好不少,特别是那种处理过程中涉及到IO操作频繁的场景,更为明显。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题