转自:https://blog.csdn.net/dutsoft/article/details/51452598

Flask,webpy,Django都带着 WSGI server,当然性能都不好,自带的web server 更多的是测试用途。线上发布时,则使用高性能的 wsgi server或者是联合nginx做uwsgi 。 
greenlet是一个轻量级的协程库。gevent是基于greenlet的网络库。 
guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。

它的特点是与各个web框架结合紧密,部署特别方便

gunicorn使用

使用多进程

在多核服务器上,为了支持更多的并发访问并充分利用资源,可以使用更多的 gunicorn 进程。 
gunicorn -w 8 code:application 
这样就可以启动8个进程同时处理HTTP请求,提高系统的使用效率及性能。

配合gevent

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

# gevent
gunicorn -k gevent code:application

指定配置文件

以上设置还可以通过 -c 参数传入一个配置文件实现。 
gunicorn - gun.conf code:application

# 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'

关于gevent

gevent是一个基于libev的并发库。它为各种并发和网络相关的任务提供了整洁的API。gunicorn对于“协程”也就是Gevent的支持非常好。

Gevent 指南(英文):http://sdiehl.github.io/gevent-tutorial
Gevent 指南(中文):http://xlambda.com/gevent-tutorial
Gevent 指南(中文)下载地址:http://download.csdn.net/download/freeking101/9924351
初试Gevent – 高性能的Python并发框架:http://python.jobbole.com/87041

gevent 官网文档:http://www.gevent.org/contents.html

gevent For the Working Python Developer:http://sdiehl.github.io/gevent-tutorial/
Python 的协程库 greenlet 和 gevent:https://blog.csdn.net/freeking101/article/details/97276736

gevent.monkey介绍详见:关于gevent monkey

简单的Flask应用

Flask是一个轻量级的Web框架,核心简单而易于扩展。Flask介绍详见:Flask文档。 
用Flask简单写了一个web例子,如下:

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

用gunicorn启动Flask应用

配置文件gun.py

import os
import gevent.monkey
gevent.monkey.patch_all() import multiprocessing debug = True
loglevel = 'debug'
bind = '0.0.0.0:8800'
pidfile = 'log/gunicorn.pid'
logfile = 'log/debug.log' #启动的进程数
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gunicorn.workers.ggevent.GeventWorker' x_forwarded_for_header = 'X-FORWARDED-FOR'

使用gunicorn来启动

gunicorn -c gun.py hello:app

单纯的flask 自带的web服务器做下测试,会看到压力大的时候出现socket的问题,因为他是单进程单线程的。使用gunicorn来启动,响应速度和能力提升显著。 
配置中workers指定启动的进程数。cpu的损耗是平均到各个进程。workers的值一定不要过大,毕竟多进程对于系统的调度消耗比较大。

最新文章

  1. Xocde一次版本升级遇到的问题 (Code Sign Error)
  2. 删除表数据drop、truncate和delete的用法
  3. javascript编程: JSON, Mapping, 回调
  4. Redis高级实践之————Redis短连接性能优化
  5. 对象创建型模式------Builder(生成器或建造者模式)(2)
  6. MySql 5.7密码查看或修改
  7. Content Provider Basics ——Content Provider基础
  8. 【转】Android LCD(四):LCD驱动调试篇
  9. linux下利用ruby做系统备份与还原
  10. php不用正则表达式实现身份证号验证详解
  11. VM中的Linux如何设置共享文件夹
  12. [UnityAPI]SerializedObject类 & SerializedProperty类
  13. sap 查看类的修饰属性
  14. 强大的shell(一键redis,mysql,php,openresty,jdk)
  15. pip virtualenv requirement
  16. js jquery 按钮点击后 60秒之后才能点击 60秒倒计时
  17. Class类的特性(上)
  18. svn回退版本/取消修改
  19. Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面
  20. JSON运用——PHP中使用json数据格式定义字面量对象的方法

热门文章

  1. Activiti6 学习日志(一):整合 SpringBoot2.1.3
  2. Docker巨轮的航行之路-基础知识篇
  3. numpy(深)复制一个矩阵的方法
  4. Paper templates for Word(Word论文模板)
  5. cb09a_c++_顺序容器的操作2-在顺序容器中添加元素_插入数据
  6. SLS编写规范
  7. [ C++ ] 勿在浮沙筑高台 —— 内存管理(18~31p) std::alloc
  8. 在maven项目中使用Junit进行单元测试(一)
  9. android中使用https是否对服务证书合法性校验的新的体会
  10. redis基础二----操作set数据类型