tornado 不是已经异步了吗, 为什么加上 gevent 后会更快?
提问来自于这篇 blog, 速度测试
走同样的路,发现不同的人生
猜測是因為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.
猜測是因為gevent是c的模組,而tornado封包重組,HTTP協定解析都是python寫的,例如解析HTTP頭用的是正規。 。 。
tornado-over-gevent 中 tornado 運行於 wsgi 模式,HTTP協定解析等工作就由 gevent 完成了。
題主的疑問中,非同步不一定就比同步的更快吧,這需要看具體應用場景。
相比較而言,如果不是並發,並且不是針對有阻塞的操作。同步和異步誰更快還不好說。
python 的並發技術中,大致是多線程,多進程,協程。可以參考下這篇文章
tornado 可以非同步也可以同步,具體還得看如何使用。
原文說:
我在別的文章裡看到這樣的測試結論。既然快不了多少,不如不用。
tornaod提供了一個魔術的stackcontext manager來提供對協程的上下文管理,而這個是tornado實現的。而gevent把相同的工作用C完成了。但是兩者的效率相差並沒有太多。
另外一點值得一提的時候, tornado其實提供了一個@coroutine的機制,這個讓同步的寫法也消耗了效率。
聽我老大說的, gevent 使用的是 greenlet + epoll, greenlet 自訂了堆疊, greenlet 有點類似 goroutine,
可以實現並行. tornado只是自已實現了 epoll.