Python Web编程之WSGI协议简介


Posted in Python onJuly 18, 2018

本文实例讲述了Python Web编程之WSGI协议。分享给大家供大家参考,具体如下:

WSGI简介

Web框架和Wen服务器之间需要进行通信,如果在设计时它们之间无法相互匹配,那么对框架的选择就会限制对Web服务器的选择,这显然是不合理的。这时候需要设计一套双方都遵守的接口。WSGI是Python Web Server Gateway Interface的简称。WSGI标准在PEP 333中定义并被许多框架实现,它规定了一种在Web服务器之间具有可移植性。在后来的PEP 3333中添加了Python 3的支持和更多相关的说明。有了通用的WSGI协议,Web开发者就能够任意选择适合自己的组合,而Web服务器和Web框架的开发者们也能够把精力集中到各自的领域。

常见的WSGI容器

WSGI是一个同步接口,所以Tornado的WSGI容器是无法实现异步的。主流的选择是GunicornuWSGI

Gunicorn

Gunicorn易于配置,兼容性好,CPU消耗很少,在豆瓣使用广泛。它支持多种Worker模式,推荐的模式有如如下几种:

  • 同步Worker:默认模式,也就是一次只处理一个请求
  • 异步Worker:通过Eventlet、Gevent实现的异步模式
  • 异步IO Worker:目前支持gthread和gaiohttp两种类型

安装Gunicorn:

pip install gunicorn

Gunicorn的启动非常简单,语法如下:

gunicorn [OPTIONS] MODULE_NAME:VARIABLE_NAME

举个栗子,manager.py:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
  return "Hello World"
if __name__ == "__main__":
  app.run()

启动应用:

gunicorn manager:app -b 0.0.0.0:9000

亦或者指定Worker数量启动:

gunicorn --workers=3 manager:app -b 0.0.0.0:9000

app为Flask实例的名称,Worker的数量推荐值是CPU的个数*2+1,CPU个数使用如下的方式获取:

python -c 'import multiprocessing; print multiprocessing.cpu_count()'

uWSGI

uWSGI是使用C编写的,显示了自有的uwsgi协议的Web服务器。它自带丰富的组件,其中核心组件包含进程管理、监控、IPC等功能,实现应用服务器接口的请求插件支持多种语言和平台,比如WSGI、Rack、Lua WSAPI,网管组件实现了负载均衡、代理和理由功能。

安装uWSGI

pip install uwsgi

使用uWSGI启动应用:

uwsgi --http 0.0.0.0:9000 --wsgi-file manager.py --callable app --processes 4 --threads 2 --stats 0.0.0.0:5000

上面的命令表示启动了4个进程,每个进程使用2个线程,而且开启了5000的Web接口,返回监控uWSGI的信息,一级不同进程和线程的详细使用情况。使用uWSGI有两点十分重要:

?http-socket?http其实是完全不同的两个选项。如果想直接裸跑uWSGI,应该使用?http,它产生一个额外的进程将请求转发给Workers,如果希望它被反向代理(比如和Nginx一起使用),应该使用?http-socket

合理的进程数和线程数不能简单的通过CPU * 2来计算得出,需要不断的尝试而找到最佳值。

uWSGI命令常用参数如下:

参数名 含义
?http 协议类型和端口号
?processes 开启的进程数量
?callable uWSGI加载的模块哪个变量将被调用
?workers 开启的进行数量,等同于processes
?chdir 指定运行目录
?wsgi-file 载入wsgi-file(加载wsgi.py文件)
?stats 在指定的地址上开启状态服务
?threads 开启的线程数量
?master 允许主进程存在
?daemonize 使进程在后台运行,并将日志输出到指定的日志文件或者UDP服务器
?pidfile 指定PID文件的位置,记录主进程的PID号
?vacuum 当服务器退出时自动清理环境,删除Unix Socket文件和PID文件

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现堆栈与队列的方法
Jan 15 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
PyQt5每天必学之拖放事件
Aug 27 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
Python中join()函数多种操作代码实例
Jan 13 Python
Python如何在bool函数中取值
Sep 21 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 26 Python
使用 Python 实现文件递归遍历的三种方式
Jul 18 #Python
详解flask入门模板引擎
Jul 18 #Python
Sanic框架基于类的视图用法示例
Jul 18 #Python
flask入门之表单的实现
Jul 18 #Python
Flask入门之上传文件到服务器的方法示例
Jul 18 #Python
flask入门之文件上传与邮件发送示例
Jul 18 #Python
Sanic框架流式传输操作示例
Jul 18 #Python
You might like
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
两个Javascript小tip资料
2010/11/23 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
Python中删除文件的程序代码
2011/03/13 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
使用Python生成XML的方法实例
2017/03/21 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
python重要函数eval多种用法解析
2020/01/14 Python
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
运动会广播稿200米
2014/01/27 职场文书
求职自荐信的格式
2014/04/07 职场文书
小学生环保倡议书
2014/05/15 职场文书
学校花圃的标语
2014/06/18 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
Nginx进程调度问题详解
2021/09/25 Servers