目录
4、AsyncIO Workers(gthread, gaiohttp)
一、什么是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