django、flask和tornado区别

今天咱们来讨论一下、django、flask和tornado的部署对比:node

1. 概述

在python的web开发框架中,目前使用量最高的几个是django、flask和tornado, 常常会有人拿这几个对比,相信你们的初步印象应该是 django大而全、flask小而精、tornado性能高。python

tornado性能比django和flask高不少是由于tornado在底层io处理机制上和django以及flask有着根本的区别:nginx

1\. tornado、gevent、asyncio、aiohttp:底层使用的是事件循环+协程
2\. django和flask: 传统的模型,阻塞io模型

虽然django和flask比tornado和asyncio性能低,可是他们做为老牌的框架:生态丰富,代码容易理解,简单啊!可是我相信经过asyncio和tornado进行并发编程一定会成为将来的另外一个主流方向。这里我我的更看好基于asyncio的框架。nodejs和go语言都得益于协程轻松实现了高并发。程序员

可是今天咱们要介绍的并非协程,而是从这些框架的部署来进行对比:web

2. django和flask

在django和flask部署中,咱们常常会遇到如下几个概念:django

web框架、 wsgi、  uwsgi、   uWSGI、    nginx

这些概念是什么意思:编程

  1. WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通讯的规范。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。
  2. uwsgi:与WSGI同样是一种通讯协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information)
  3. uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。
  4. WSGI协议主要包括server和application两部分:
  5. WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;
  6. WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中能够包括多个栈式的中间件(middlewares),这些中间件须要同时实现server与application,所以能够在WSGI服务器与WSGI应用之间起调节做用:对服务器来讲,中间件扮演应用程序,对应用程序来讲,中间件扮演服务器。
  7. WSGI协议实际上是定义了一种server与application解耦的规范,便可以有多个实现WSGI server的服务器,也能够有多个实现WSGI application的框架,那么就能够选择任意的server和application组合实现本身的web应用。例如uWSGI和Gunicorn都是实现了WSGI server协议的服务器,Django,Flask是实现了WSGI application协议的web框架,能够根据项目实际状况搭配使用。
image.png

像Django,Flask框架都有本身实现的简单的WSGI server,通常用于服务器调试,生产环境下建议用其余WSGI server。好比django启动 manage.py runserver 就是启动的这个,这种只适用于本地开发的时候使用,线上运行仍是须要配置nginx+uwsgi+django才行。flask

wsgi 除了解析 http 协议以及 http 端口侦听外,还负责了流量转发以及 wsgi application 进程管理的功能。通常 wsgi 框架内置的 wsgi server 都是一个单进程,一次只能处理一个请求。而目的通用的 wsgi server(gunicorn, uwsgi)都至少支持 pre fork 模型,这种模型会起一个 master 来侦听请求,并启动多个 slave(每一个 slave 是一个 wsgi application), master 负责把请求转发到空闲的 slave 上。除了这种传统的基于进程的 pre fork 同步模型,不一样的 wsgi server 也会支持一些其它模型,有基于线程的同步模型,也有基于 asyncio 的异步模型。浏览器

3. nginx又有什么用呢?

  • Ningx是一个反向代理服务器安全

    什么是反向代理?

    正向代理,例如FQ用的代理服务器就是正向代理,浏览器主动请求代理服务器,代理服务器转发请求到对应的目标服务器
    反向代理,部署在Web服务器上,代理全部外部网络对内部网络的访问。浏览器访问服务器,必须通过这个代理,是被动的。
    正向代理的主动方是客户端,反向代理的主动方是Web服务器。

image.png
  • 主要是由于 wsgi server 支持的并发量比较低,通常会用一个专门的 http server 来作一层缓冲,避免并发量过大时直接服务挂掉。

    反向代理的做用:
    1. 安全,客户端对Web服务器的访问须要先通过反向代理服务器。这样能够防止外部程序对Web服务器的直接攻击。
    2. 负载均衡,反向代理服务器能够根据Web服务器的负载状况,动态地把HTTP请求交给不一样的Web服务器来处理,前提是要有多个Web服务器。
    3. 提高Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是须要时间的,例如N秒,若是直接传给Web服务器,Web服务器就须要让一个进程阻塞N秒,来接收IO,这样会下降Web服务器的性能。若是使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提高Web服务器的性能。还有一些静态文件的请求,能够直接交给反向代理来处理,不须要通过Web服务器。
    Nginx是一个高性能的HTTP和反向代理服务器。

4. Nginx+uWSGI+应用程序的架构

image.png

5. django如何编写异步代码呢?

1\. 直接用传统的异步编程(进程,线程,协程),虽然有些 wsgi server 支持 asynio 模型,可是这也须要用户所写的代码作相应的支持。这就致使了若是咱们在 wsgi application 的时候不能随便使用线程和异步 IO ,若是用了就须要配置 wsgi server 使其支持咱们本身的写法。所以为了使得咱们缩写的 application 能部署在任意的 wsgi server(container)中,咱们就只能写同步代码了。
2\. 使用分布式异步编程,使用相似 celery 的方式,将须要异步处理的东西发送到 worker 去处理。

python 传统的这种 wsgi 模型,主要是为了方便框架开发者只须要专一框架层面,而非 http 处理层面。但这样却增长了服务部署的复杂度,须要同时部署和配置 http server 和 wsgi server ,若是想支持异步还要部署 worker ,而使用 tornado 或 go 开发的应用由于本身实现了高效 http 处理的应用只须要部署本身就能够了。

6. asyncio VS tornado

asyncio做为python的原始协程库,也是python最具野心和未来会重点打造的模块,asyncio提供了更多的基础功能,tornado是web服务器和web框架,二者原理是同样的,都有很不错的发展。

  • twisted 这种模型:

这种模型和上面的传统模型处于一个时期,这种模型和 nodejs 差很少,都是基于回调的模型,适用于高 IO 低 CPU 的场景。这种模型本身实现了一个基于回调 http server(event loop),每个请求都被注册成一个异步函数来处理,而后主循环来不断的循环这些函数。这样就和 pre fork 模型有了区别, pre fork 模型中每个 slave 都是一个 wsgi application ,一个 wsgi application 都只能处理一个请求,而回调模型只有一个线程,不只极大的减小了内存的分配还减少了进城以及线程间的切换开销,从而能够支持高 IO 并发。可是这种模型也有很明显的缺点,就是一旦应用程序有大量的 CPU 计算,就会让这个线程堵住,全部的请求都会收到影响,若是应用在处理一个请求时崩溃,全部的请求也都会收到影响。

  • asyncio、tornado、gevent 这种模型:

    由于回调的写法不易读也容易出错,因而将回调的写法改为了同步的写法。这种模型和 koa2 和 go net/http 查很少, asyncio 提供了相似 go coroutine 的功能和写法,而 aiohttp 则提供了相似 go 中的 net/http 的 http 处理库。

想要完全理解tornado这种模式以及想要本身去实现高并发的web服务器咱们须要理解协程,协程理解比线程和进程难很多,最复杂的调度机制,经过asyncio去理解会相对容易

点击查看更多内容

做者:bobby
连接:https://www.imooc.com/article/details/id/24759
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合做

本文同步分享在 博客“程序员八阿哥”(JianShu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。