知乎为什么选择Tornado作为开发框架

Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因-----因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。
但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。 
所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。 
@刘连响 提到的那个测试(http://kb.cnblogs.com/a/1591500/)在实际应用中并没有什么价值。因为实际应用中必然有逻辑处理,逻辑处理必然要阻塞I/O,这会使Tornado的性能大幅下降。测试可在网页代码
self.write("hello world")
前加一句
time.sleep(0.01)
,假设每个Request阻塞I/O 10毫秒,再测试一下性能。 至于你提到的Tornado文档少的问题,我觉得你可以抽空阅读一下Tornado的代码,毕竟是个轻量级框架,代码不多,但是注释却很详细,很容易看懂。请记住,代码永远是最好的文档! 各位,别忘了,只有原生异步才能发挥出Tornado的最大优势,比如Tornado自带的mysql库就不是异步的(实际上这个库就是MySQLdb的包装),一旦SQL调用阻塞,整个Tornado进程也会阻塞,这种情况下gen也是帮不了你的。gen只是为了让异步调用更简单,没办法把一个同步函数变为异步函数。

原文地址:https://www.cnblogs.com/lddhbu/p/2909289.html