Gunicorn介绍 - ziliantech-org/doc-zilian-wiki GitHub Wiki

By lizyubuaa

Gunicorn是什么

Gunicorn是基于unix系统,被广泛应用的高性能的Python WSGI HTTP Server。用来解析HTTP请求的网关服务。 它通常是在进行反向代理(如nginx),或者进行负载均衡(如 AWS ELB)和一个web 应用(比如 Django 或者 Flask)之间。 所谓WSGI(Web Server Gateway Interface)。它是一种通用的接口规范,规定了web server(如Apache、Nginx)和web app(或web app框架)之间的标准。目的为了将web和app解耦、再连接起来的一道桥梁。web app开发者就能专注于业务逻辑、专注于HTML文档的生成,而不用操心繁琐的网络底层实现(HTTP请求接收、建立连接、返回响应等),并能方便地组合搭配不同的web server + web app/框架了。 pre-fork worker model worker model:意味着这个模型有一个master进程,来管理一组worker进程; fork:意味着worker进程是由master进程fork(复刻)出来的; pre-:意味着在任何客户端请求到来之前,就已从master进程fork出了多个worker进程,坐等请求到来; 执行流程:在worker进程创建时,就被实例化了Python web app;并由worker进程监听端口、处理请求。当请求到来时,worker进程就能解析HTTP请求、调用Python web app处理、得到处理结果后,再整理成HTTP Response,通过TCP返回给客户端。 注:master进程不是管理处理请求的,只负责管理worker进程,比如对worker进程的创建、销毁、以及根据负载情况增减。(启动时设置的–workers参数只是worker数,而gunicorn还会创建一个master进程。所以,即使配置workers为1,你的app也至少有两个进程:master负责管理,worker负责处理请求)。

工作原理

gunicorn的工作模式一般分为同步worker使用和异步worker使用。

1、同步worker(Sync Worker)

默认的、最简单的worker模式,就是同步模式。 每个worker进程,一次只处理一个请求;如果此时又有其他请求被分配到了这个worker进程中,那只能被堵塞了,只能等待第一个请求完成。 并且,一个请求一个进程,并发时,是非常消耗CPU和内存的。 注:因此,只能适合在访问量不大、CPU密集而非I/O的情形。 但是也有好处,好处就是,即使一个worker的进程crash了,也只会影响到一个请求。不会影响其他的请求

2、异步workers(Async Worker)

异步worker有Gevent和Eventlet两种,都是基于Greenlet实现的。 当使用了异步worker,就能同时处理不止一个请求,就不会出现上面同步worker那样,当一个请求就把后续请求都block堵塞住了。 注:gunicorn允许通过设置对应的worker类来使用这些异步Python库。 例如:我们想在单核机器上运行的gevent: gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app

解释:worker-connection 是对于 gevent worker 类的特殊设置。(2CPU)+1 仍然是建议的worker数量。 因为这里是单核,我们设置的是3个worker。在这种情况下,最大的并发请求数是3000(3个worker1000个连接数/worker)

3.多线程模式 gunicorn 还允许每个worker拥有多个线程。在这种模式下,每个worker都会加载一次,同一个worker生成的每个线程共享相同的内存空间。 最大的并发请求就是worker * 线程 , 也就是10

建议

  • IO 受限? - 建议使用gevent或者asyncio
  • CPU受限? - 建议增加workers数量
  • 不确定内存占用? - 建议使用gthread
  • 不知道怎么选择? - 建议增加workers数量

参考文献