gunicorn实现flask并发

目录

一、什么是gunicorn

1、简介

2、优势

3、源码分析入口

二、gunicorn安装部署

三、gunicorn简单应用

四、gunicorn worker Model

1、同步worker模式sync

2、异步worker模式

3、Tornado Workers

4、AsyncIO Workers(gthread, gaiohttp)

5、各模式对比

6、如何选择工作模式

五、gunicorn启动多少个workers子进程

六、如何动态修改worker数量

七、多线程模式

八、gevent协程-实现高并发

九、gunicorn部署

十、压力测试

1、Flask原生压力测试

2、gunicorn并发压测压力测试

3、当并发用户数为1时,二者吞吐率几乎一样

4、ab参数说明

十二、eventlet和gevent对比

1、Gevent简介

2、eventlet简介


一、什么是gunicorn

1、简介

Gunicorn(绿色独角兽Green Unicorn的简称),是一个Python WSGI HTTP server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。

Gunicorn服务器广泛兼容各种web框架,实现简单,服务器资源少,而且速度相当快。官方建议Nginx+gunicorn性能最好。

2、优势

Gunicorn的优势在于,它采用的是pre-fork worker模式, gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,即一个master进程管理多个worker进程(管理进程:master,工作进程:worker),所有请求和响应均由Worker处理。

Master进程是一个简单的loop, 监听 worker不同进程信号并且作出响应。这样可以减少频繁创建和销毁进程的开销,但是一个进程相对占用资源,会消耗大量内存。

Gunicorn推荐的worker数量是:(2*$num_cores)+1。

3、源码分析入口

https://github.com/benoitc/gunicorn/blob/master/gunicorn/app/wsgiapp.py

二、gunicorn安装部署

$ pip install gunicorn

如果应用程序可能需要在请求处理期间暂停很长一段时间,这时建议安装Eventlet或Gevent,异步执行worker。

$ pip install greenlet

$ pip install eventlet

$ pip install gevent

三、gunicorn简单应用

基本使用格式:

$ gunicorn  [OPTIONS]  [WSGI_APP]

使用示例,在/home/myproject目录下,创建test.py文件,如下:

def app(environ, start_response):
    """Simplest possible application object"""
    data = b'Hello, World!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type', 'text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])

运行:

$ gunicorn --workers=8 --chdir /home/myproject test:app

常用参数:

-c CONFIG, --config=CONFIG 指定配置文件

-b BIND, --bind=BIND 绑定运行的主机和端口

-w INT, --workers INT 用于处理worker进程的数量,默认为1

-k STRTING, --worker-class STRTING 指定要使用的工作模式,默认为sync异步,类型:sync, eventlet, gevent, tornado, gthread, gaiohttp

--threads INT 处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1

--worker-connections INT 最大客户端并发数量,默认1000

--chdir 在加载应用程序之前切换目录

更多参数详情参考:$ gunicorn -h

四、gunicorn worker Model

Gunicorn的工作模式是通过work_class参数配置的值,默认缺省值为sync。

当前支持的工作模式类型清单:sync, eventlet, gevent, tornado, gthread, gaiohttp

1、同步worker模式sync

默认worker class,为sync worker,是最简单的工作模式,在cpu和带宽方面会消耗资源。性能低。

大多数情况下,采用的worker类型是同步方式,也就是说一次仅处理一个请求。这种模型方式是最简单的,因为期间发生的任何错误最多只影响到一个请求。

对应class SyncWorker(base.Worker) ,源码分析参考:https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/sync.py

2、异步worker模式

这里指的是greenlet worker,异步workers分两种,一个是eventlet,另一个是gevent。二者都是基于greenlets软件包。

greenlet是用python来实现的协程方式实现的(cooperative multi-threading)。源码对应文件:geventlet.py和ggevent.py。

建议采用异步worker的场景:

1)需要长时间阻塞调用的应用,比如外部的web service

2)直接给internet提供服务

3)stream流请求和响应

4)长轮询

5)Web sockets(web sockets可以允许用户在浏览器中实现双向通信,实现数据的及时推送)

6)Comet彗星(基于HTTP长连接的服务器推送技术(Server Push),是一种新的 Web 应用架构。服务器端会主动以异步的方式向客户端程序推送数据。Comet架构适用于事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用)

3、Tornado Workers

可以用于使用Tornado框架编写应用程序。不推荐使用这种配置。

4、AsyncIO Workers(gthread, gaiohttp)

此worker与Python3兼容。

gaiohttp worker利用aiohttp库实现异步I/O,支持web socket;

gthread worker采用的是线程工作模式,利用线程池管理连接。它在主循环中接受连接,已接受的连接作为连接作业添加到线程池中。

5、各模式对比

sync底层实作是每个请求都由一个process处理。多进程模式,--workers参数,指定了工作进程的数量。

gthread则是每个请求都由一个thread处理。多线程模式。

eventlet、gevent底层则是利用非同步IO让一个process在等待IO回应时继续处理下个请求。协程模式。

6、如何选择工作模式

IO受限,建议使用gevent或者asyncio

CPU受限,建议增加workers数量

不确定内存占用?建议使用gthread

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值