tornado 不是已经异步了吗, 为什么加上 gevent 后会更快?
提问来自于这篇 blog, 速度测试
tornado 不是已经异步了吗, 为什么加上 gevent 后会更快?
提问来自于这篇 blog, 速度测试
题主的疑问中,异步不一定就比同步的更快吧,这需要看具体应用场景。
相比较而言,如果不是并发,并且不是针对有阻塞的操作。同步和异步谁更快还不好说。
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操作频繁的场景,更为明显。
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
猜测是因为gevent是c的模块,而tornado封包重组,HTTP协议解析都是python写的,比如解析HTTP头用的是正则。。。
tornado-over-gevent 中 tornado 运行于 wsgi 模式,HTTP协议解析等工作就由 gevent 完成了。