之前面试的时候我提到过自己有Flask、Django、Tornado框架的使用经验,于是面试官很自然就问到了这三大框架的区别、各自的特点这样的问题。回答了几次总觉得自己回答得不是太好,有些点没有回答到,亦或是逻辑有点混乱,于是想要归纳总结一下。
Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展
可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等
没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL
核心基于Werkzeug WSGI工具 和jinja2 模板引擎
2005年,劳伦斯出版集团为开发新闻网站开发了Django,是基于python语言编写的开源web开发框架
Django基于自身框架结构形成了MVT设计,遵循MVC设计
Django是一个重量级框架功能齐全,提供一站式解决的思路,能让开发者不用在选择上花费大量时间
自带ORM和模板引擎,支持jinja等非官方模板引擎
最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台
成熟,稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发
Tornado是2009年9月10日发布的一个用Python语言写成的Web服务器兼Web应用框架
Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有非常高性能的框架
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快
Tornado走的是少而精的方向,注重的是性能优越
Tornado应该运行在类Unix平台,在线上部署时为了最佳的性能和扩展性,仅推荐Linux和BSD(因为充分利用Linux的epoll工具和BSD的kqueue工具,是Tornado不依靠多进程/多线程而达到高性能的原因)
延伸阅读:C10K问题
基于线程的服务器,如Apache,为了传入的连接,维护了一个操作系统的线程池。Apache会为每个HTTP连接分配线程池中的一个线程,如果所有的线程都处于被占用的状态并且尚有内存可用时,则生成一个新的线程。尽管不同的操作系统会有不同的设置,大多数Linux发布版中都是默认线程堆大小为8MB。Apache的架构在大负载下变得不可预测,为每个打开的连接维护一个大的线程池等待数据极易迅速耗光服务器的内存资源。
性能测试对比:
http://klen.github.io/py-frameworks-bench/
https://www.jianshu.com/p/9960a9667a5c