WSGI Server有哪些:

比如 Flask,webpy,Django、CherryPy 都带着 WSGI server 。当然性能都不好,自带的web server 更多的是测试用途, 发布时则使用生产环境的 WSGI server或者是联合nginx做uwsgi 。

诚如那个WSGI的定义所说的,协议定义了一套接口来实现服务器端与应用端通信的规范化(或者说是统一化)。这是怎样的一套接口呢?很简单,尤其是对于应用端。

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

神器 Gunicorn是一个Python WSGI UNIX的HTTP服务器。这是一个预先叉工人模式,从Ruby的独角兽(Unicorn)项目移植。该Gunicorn服务器与各种Web框架兼容,我们只要简单配置执行,轻量级的资源消耗,以及相当迅速。它的特点是与各个web结合紧密,部署特别方便。 缺点也很多,不支持HTTP 1.1,并发访问性能不高。

安装 gunicorn  ~

pip install gunicorn

这里我们说下 gunicorn 的用法

最简单的运行方式就是:

gunicorn code:application

其中code就是指code.py,application就是那个wsgifunc的名字。

这样运行的话, gunicorn 默认作为一个监听 127.0.0.1:8000 的web server,可以在本机通过: http://127.0.0.1:8000 访问。

如果要通过网络访问,则需要绑定不同的地址(也可以同时设置监听端口):

gunicorn -b 10.2.20.66:8080 code:application
#from http://rfyiamcool.blog.51cto.com

在多核服务器上,为了支持更多的并发访问并充分利用资源,可以使用更多的 gunicorn 进程:

gunicorn -w 8 code:application

这样就可以启动8个进程同时处理HTTP请求,提高系统的使用效率及性能。

另外, gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好, 它还支持其它更好的模式,比如:gevent或meinheld。

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

#  gevent

gunicorn -k gevent code:application

#  meinheld

gunicorn -k egg:meinheld#gunicorn_worker code:application

当然,要使用这两个东西需要另外安装,具体请参考各自的文档。

以上设置还可以通过 -c 参数传入一个配置文件实现。

gunicorn 的配置文件 

[root@66 tmp]# cat gun.conf
import os
bind = '127.0.0.1:5000'
workers = 4
backlog = 2048
worker_class = "sync"
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'

python web 一个例子

[root@66 tmp]# cat xiaorui.py
from flask import Flask
from flask import render_template_string
import os
from werkzeug.contrib.fixers import ProxyFix
app = Flask(__name__)
@app.route('/')
def index():
return "worked!"
app.wsgi_app = ProxyFix(app.wsgi_app)
if __name__ == '__main__':
app.run()

先跑本身的demo ~

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

结果是:

结果还算可以~    当然跑的实例也简单~

cpu的损耗,不小哈~

其次的问题是,flask的web server在压力下出现回应的错误。。。 我以前测试 tornado web.py flask django botto的压力,让朋友写的cc工具做的测试。。。

结果是  tornado确实很牛,然后是flask,接着是web.py,最烂的是django

django本身的抗压确实让人蛋疼,还好大家在nginx做负载。

单实例测试完了,咱们开始测试 高性能神器 gunicorn 做wsgi

启动后会出现:

2013-08-12 21:59:34 [2097] [INFO] Starting gunicorn 17.5
2013-08-12 21:59:34 [2097] [DEBUG] Arbiter booted
2013-08-12 21:59:34 [2097] [INFO] Listening at: http://127.0.0.1:5000 (2097)
2013-08-12 21:59:34 [2097] [INFO] Using worker: sync
2013-08-12 21:59:34 [2102] [INFO] Booting worker with pid: 2102
2013-08-12 21:59:34 [2103] [INFO] Booting worker with pid: 2103
2013-08-12 21:59:34 [2104] [INFO] Booting worker with pid: 2104
2013-08-12 21:59:34 [2105] [INFO] Booting worker with pid: 2105

我们再来测试下性能~

上次用了6秒左右,这次用gunicorn达到了2.4秒左右。。。。。 这速度对比,已经很明了了~

要是还想提高速度,可以改gun.conf配置文件中的worker数目。

cpu的损耗是平均到各个进程,而不是独立在flask的web server上

现在我们开始测试gevent 作为wsgi 网关接口的实力~

flask的一个demo~

gevent wsgi的配置,我先简单的做下配置。。。。

大家想看实例的话,可以去gevent的官网的wsgi的demo   那边还附有编程的接口。。。

from gevent.wsgi import WSGIServer
from a import app
http_server = WSGIServer(('', 11111), app)
http_server.serve_forever()

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

我们开始测试更牛逼的gevent的并发能力 。

服务端:

客户端:

看到秒数了吧~    啥也不说了~    大家都懂了~

我们稍微调节一下~

事实上, gunicorn 调用 gevent workers 的代码类似这样的原理(uwsgi+gevent 也是差不多的做法).

#!/usr/bin/env python
# coding:utf-8 import sys
import os import gevent
import gevent.monkey
import gevent.wsgi
import gevent.server
gevent.monkey.patch_all() import socket
import multiprocessing def app(environ, start_response):
start_response('200 OK', [('Content-Type','text/plain')])
yield str(socket.getaddrinfo('xiaorui.cc', 80)) def handle_signals():
gevent.sleep(sys.maxint) if __name__ == '__main__':
listenner = gevent.server._tcp_listener(('', 8002), backlog=500, reuse_addr=True)
for i in xrange(multiprocessing.cpu_count()*2):
server = gevent.wsgi.WSGIServer(listenner, app, log=None)
process = multiprocessing.Process(target=server.serve_forever)
process.start()
handle_signals()

uwsgi现在也支持gevent的方式:

uwsgi --plugins python,gevent --gevent 100 --socket :3031 --module myapp

总之,gunicorn和gevent,或者是gunicorn+gevent的合体 都是很值得尝试的东西。

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

下图是我推荐的网络框架~ 这个框架和uwsgi的方式很像的,都是在nginx pass_proxy到app的前端口,然后用uwsgi或者是gunicorn来协同处理 。

server {
listen 80;
server_name xiaorui.cc; root /www/xiaorui; access_log xiaorui/access.log;
error_log xiaorui/error.log; location / {
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8000;
break;
}
}

前端Nginx负载,几个核就跑几个Gunicorn进程,gunicorn相对后面的app又可以给出几个进程。

比起 uWSGI 来说,Gunicorn对于“协程”也就是Gevent的支持会更好更完美。

方便以后业务的扩展和运营精细化。性能上Gunicorn+Gevent不会比uWSGI弱多少,毕竟后者纯C能只有这么点性能也不容易,比起WSGI Server里面最强的Bjoern而言,Gunicorn也有对应的Meinheld这种利器,况且后者对于HTTP协议的支持比Bjoern更完善。Gevent虽然不是异步框架里面性能最好的,但是绝对是最完善的,社区活跃度也非常高,加上方便的monkey_patch,使得大多数应用不用改代码就能方便地平移过来。这2者结合可以就保证了稳定性,又能有较好性能的组合。

想简单扩展就用 Gunicorn+Gevent,想麻烦折腾就用nginx 做uwsgi或gunicorn的组合 。

高性能框架gevent和gunicorn在web上的应用及性能测试的更多相关文章

  1. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  2. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  3. flask +gevent+nginx+Gunicorn+supervisor部署flask应用

    上篇   可以完美部署flask ,但是视乎在结合gevent+apscheduler 实现异步非阻塞后台和定时任务的时候视乎不是那么完美.请教了前辈,决定使用flask+gevent+nginx+g ...

  4. Python3 Flask+nginx+Gunicorn部署(上)

    前言:一般在本地运行flask项目通常是直接python3 文件名.py,然后打开:http://127.0.0.1:5000 查看代码结果 这次主要是记录flask在python3 环境结合ngin ...

  5. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  6. 【读书笔记】读《高性能网站建设指南》及《高性能网站建设进阶指南:Web开发者性能优化最佳实践》

    这两本书就一块儿搞了,大多数已经理解,简单做个标记.主要对自己不太了解的地方,做一些记录.   一.读<高性能网站建设指南> 0> 黄金性能法则:只有10%~20%的最终用户响应时间 ...

  7. Web桌面应用框架2:著名的WEB桌面应用分析

    前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是 ...

  8. Web上传文件的原理及实现

    现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2 ...

  9. hdjs---laravel 框架使用hdjs 实现多图上传功能

    hdjs---laravel 框架使用hdjs 实现多图上传功能 一.总结 一句话总结: [在网上找hdjs的使用实例]和[能遇见讲hdjs的视频],也是完全搞懂hdjs的不错的方式 1.hdjs中的 ...

随机推荐

  1. Idea基本讲解、常用配置以及快捷键设置

    IDEA官网学习文档:https://www.jetbrains.com/idea/documentation/ IDEA官网入门教程:https://www.jetbrains.com/help/i ...

  2. 使用母版页时内容页如何使用css和javascript

    由于网站的主要频道页和列表页的头部和底部都是一样的,如果将每个页面放在单独的页面中,当头部和底部需要更改时维护量太大.于是想把头部和底部做成母版页,频道页和列表页的具体内容放到内容页中.这样当头和底需 ...

  3. Cocos2d-x JSB 自己主动绑定bindings

    Javascript Binding (简称JSB) 自己主动绑定教程. Cocos2d-x JSB 自己主动绑定bindings-generator (以下简称B-G) 使用心得 假设想弄清深入原理 ...

  4. 【自用】OI计划安排表一轮

    网络流√ 上下界最大流√ 线性规划转费用流√ RMQ优化建图√ 单纯形√ 字符串相关 hash√ 扩展KMP 回文自己主动机 数据结构 平衡树 启示式合并 替罪羊树 LCT 树套树 KD-Tree 二 ...

  5. weexapp 开发流程(一)开发环境配置

    1.创建项目 weexpack create weexapp 2.安装必要插件 npm i jwt-simple vue-resource vue-router vuex vuex-router-sy ...

  6. 为Joomla 2.5的连续插入多幅图像添加便捷方式

    用过Joomla 2.5的朋友应该都知道插入很多图像时是比較麻烦的.点了文章以下的图片button,它会弹出个div,让你选择图片,每选一张.div就关闭. 再选第二张的时候,它又要你又一次选择文件夹 ...

  7. 2015 Multi-University Training Contest 3--1011 Work

    代码: #include<cstdio> #include<cstring> using namespace std; int n,k; int father[105],son ...

  8. 这个捕鱼游戏制作的真心不错,原创音乐,AV动作,让人流连忘返啊呵呵

     女生看完这篇文章后果断地命令男朋友打开电脑和手机 2014-10-10 茶娱饭后 本人纯屌丝宅男一名.专注游戏十年有余,玩过无数大大小小的游戏,对捕鱼游戏情有独钟.我不想说在捕鱼游戏方面有多专业 ...

  9. 【POJ 1716】Integer Intervals(差分约束系统)

    id=1716">[POJ 1716]Integer Intervals(差分约束系统) Integer Intervals Time Limit: 1000MS   Memory L ...

  10. Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)

    一.概述: Yarn调度器有很多实现,如Fifo, Capacity和Fair schedulers等.与其同一时候,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每一个调度器都有自己 ...