当前位置: 首页 > news >正文

了解python web架构_python的几种web框架理解

首先是 http server + wsgi server(container) + wsgi application 这种传统模型吧: http server 指的是类似于 nginx 或 apache 的服务 wsgi server 指的是类似 gunicorn 和 uwsgi 这样的服务 wsgi application 指的是 flask django 这样的基于 wsgi 接口的框架运行起来的实例 最初这种模型只是为了方便 web 框架的开发者,不需要每个框架层面都去实现一遍 http server ,就增加了一个 WSGI 中间层协议,框架只要实现这个协议的客户端就可以,然后用 wsgi server 去实现 http 协议的解析并去调用客户端(wsgi application)。

为了方便开发,每个框架都内置了一个简易的 wsgi server ,为什么还要用专门的 wsgi server 呢? 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 的异步模型。

这种模型下怎样写异步代码呢?

1. 直接用传统的异步编程(进程,线程,协程),虽然有些 wsgi server 支持 asynio 模型,但是这也需要用户所写的代码做相应的支持。这就导致了如果我们在 wsgi application 的时候不能随便使用线程和异步 IO ,如果用了就需要配置 wsgi server 使其支持我们自己的写法。因此为了使得我们缩写的 application 能部署在任意的 wsgi server(container)中,我们就只能写同步代码了。

2. 使用分布式异步编程,使用类似 celery 的方式,将需要异步处理的东西发送到 worker 去处理。

既然有了 wsgi server ,为什么还要有一个 http server 呢? 主要是因为 wsgi server 支持的并发量比较低,一般会用一个专门的 http server 来做一层缓冲,避免并发量过大时直接服务挂掉。

python 传统的这种 wsgi 模型,主要是为了方便框架开发者只需要专注框架层面,而非 http 处理层面。但这样却增加了服务部署的复杂度,需要同时部署和配置 http server 和 wsgi server ,如果想支持异步还要部署 worker ,而使用 tornado 或 go 开发的应用因为自己实现了高效 http 处理的应用只需要部署自己就可以了。

接下来是 tornado 和 twisted 这种模型:

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

接下来时 aiohttp/sanic 这种模型:

这种模型和 tornada 模型的改进,但实质上是一样的,因为回调的写法不易读也容易出错,于是将回调的写法改成了同步的写法。这种模型和 koa2 和 go net/http 查不多, asyncio 提供了类似 go coroutine 的功能和写法,而 aiohttp 则提供了类似 go 中的 net/http 的 http 处理库

相关文章:

  • python django框架数据库_Python的Django框架可适配的各种数据库介绍
  • python 删除所有空间_删除dataframe python中的空间
  • python接收前端post数据_Django后台获取前端post上传的文件方法
  • 水经注叠加cad_如何下载矢量格式的CAD等高线
  • JAVA特级_java高级特性-更新版本
  • java字符插入_Java程序练习-字符串插入
  • java 构造 super_java – 在构造函数中的super()
  • java 反射的实现原理图_java反射机制的实现原理
  • java 文件读取 逗号分隔_如何从Java中的文本文件中读取逗号分隔值?
  • java求导数_JAVA实现表达式求导运算的分析总结
  • java模拟登陆系统_Java模拟登录系统抓取内容【转载】
  • java httppost https_JAVA利用HttpClient进行POST请求(HTTPS)
  • acs java_ACS 4.2 安装图解
  • java nio nio2 区别_BIO、NIO与NIO.2的区别与联系
  • java 字节码分析_java字节码文件分析
  • 深入了解以太坊
  • 【React系列】如何构建React应用程序
  • 【刷算法】求1+2+3+...+n
  • Android 架构优化~MVP 架构改造
  • exif信息对照
  • Gradle 5.0 正式版发布
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript创建对象的四种方式
  • java小心机(3)| 浅析finalize()
  • js如何打印object对象
  • mysql_config not found
  • passportjs 源码分析
  • PHP变量
  • QQ浏览器x5内核的兼容性问题
  • Spring框架之我见(三)——IOC、AOP
  • Vue ES6 Jade Scss Webpack Gulp
  • vue数据传递--我有特殊的实现技巧
  • 程序员最讨厌的9句话,你可有补充?
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 简单实现一个textarea自适应高度
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 如何学习JavaEE,项目又该如何做?
  • 数组的操作
  • 我与Jetbrains的这些年
  • 昨天1024程序员节,我故意写了个死循环~
  • ​低代码平台的核心价值与优势
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #Linux(权限管理)
  • $.ajax中的eval及dataType
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)nginx 安装、启停
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (8)STL算法之替换
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • ***测试-HTTP方法
  • .net 提取注释生成API文档 帮助文档