知乎為什麼要選擇用Tornado做為web開發框架,非同步非阻塞模式在此起到了作用?
01-05
歡迎磚拍!
首先弄清楚,Tornado不只是個web框架,同時也是個http server。你可以只用它的web部分(還只有同步部分),當作個wsgi app使,這個時候拿來跟django啊flask啊做比較是相當的;你也可以拿它的httpserver部分來用,這時候他是可以做到跟nginx/apache相當的。當然,出於負載均衡的考慮,有可能在多台機器多個tornado進程之前還有個nginx做負載均衡工作,需要監控每一個進程而不能使用tornado自帶多進程式控制制,然而並不需要再通過wsgi包裹,直接做反向代理就可以起到足夠的效果,這便是與其它python系框架最大的不同。
由於自身就是個http server,這使得完整的非同步化流程得以實現,並且對多個請求發至同一個tornado進程的情況可以充分利用協程帶來的輕量化上下文切換。前者為websocket和長鏈接提供了便利,後者為高性能打下了基礎。對於沒有大量計算的業務邏輯型後段而言,Tornado的性能甚至不輸nodejs,並且語言和環境的成熟度優於node。這裡說的性能可能並不全是指每秒請求數:單進程每秒800-1000次請求處理這一點很多框架都可以做到,而單進程800-1000個長鏈接,這就不是每個每個框架都可以做好的事情了。
此外,並不是說用了Tornado,其它的東西就不能用了。Tornado前置負載均衡,後帶wsgi也行,帶內網Socket結合其它平台的分散式架構也行,擴展也有好處啊……
只要是知乎想用長連接推送功能,python裡面tornado估計是唯一比較好的選擇1.FriendFeed的成功證明了tornado,而tornado是FriendFeed發明的2.要用django,flask等必須藉助gevent等,沒有類似案例,風險太大(不穩定)
3.要想用長連接,必須是非同步非阻塞模式,不然一台機器支撐人數少的可憐
當然nodejs,php(swole)也是可以的,估計知乎看不上,人生苦短,我用python。私以為,真相很可能是當初主程對tornado最熟。
看了各位的回答,我才明白原來不是因為quora用的是tornado
@羅伊的答案很完善了,我覺得針對他的第三點而言,退回到幾年前知乎剛開始的時候,2011年,什麼nodejs啊,swoole遠沒現在成熟,tornado是最佳的選擇吧,對於一個初創項目而言。
nginx 新版加入了線程池,與tornado的非同步io的作用是一樣的嗎?
推薦閱讀: