Gunicorn源码解析

简介

主要作用

Gunicorn是Green Unicorn(绿色独角兽)的缩写。是Unix平台下的Python WSGI HTTP 服务器。Gunicorn服务器与各种遵循WSGI的Web框架广泛兼容,可以让Web框架专注于框架本身的业务实现,并且极高的提升了Web框架的并发量和提高反应速度。

wsgi 和 uwsgi

说到Gunicorn, 不得不提到WSGI协议,因为Gunicorn主要的作用是一个WSGI服务器。它主要实现WSGI协议。
WSGI 是 Python Web Server Gateway Interface的简称,是web底层跟application解耦的协议。当时Python组委会设计这个协议的时候,主要是为了让实现WSGI协议的服务器负责HTTP协议的解析和封装,而业务相关的框架则主要处理业务逻辑相关的代码和其他模块的实现,比如说Cookies和Session机制的实现,URL路由的实现和业务相关代码的实现。
WSGI很大程度简化了Web框架的实现,因为每一个实现Web框架的作者只需要让自己的框架能兼容WSGI协议,那么他就不用再重写HTTP协议的解析和封装相关的重复代码。
目前世面上最为流行的WSGI服务器主要有Gunicorn和uwsgi两款产品,它们都是开源的。总体来说,对于Gunicorn和uwsgi各有各的好处,从测试来看,uwsgi有着更高的并发量,功能也更加的丰富。但是对于稳定性来说,Gunicorn则更占上风。

整体框架梳理

通过对Gunicorn源码整个流程进行debug,大概流程主要如上图所示
一、配置模块
配置输入的方式有两种,一种为通过命令行输入,另一种则是通过配置文件进行数据。当前步骤主要通过这两种方式中的其中一种加载默认配置,根据对输入的配置进行校验,添加到配置类中。以便之后的过程中能方便的读取到配置相关的信息。
二、加载业务APP类
加载配置中给出的业务相关APP的类,主要是通过APP路径中,然后对文件通过eval的形式进行加载。
三、监听模块
监听模块采用的是多进程网络模型。通过master父进程对端口进行监听,然后fork出子进程,子进程通过共享父进程的套接字文件描述符来进行网络请求的处理。如下图所示

这样,当一个请求过来之后,那么子进程通过监听父进程的套接字描述符对发来的请求进行竞争,其中一个子进程获取到请求的处理权限。
四、请求处理模块
当一个HTTP请求发过来之后,其中一个worker进程竞争得到了整个请求的处理权利,首先是对TCP请求进行解析,然后把TCP请求里面的字节转化成HTTP Request的对象,然后将其参数赋值给environ变量结构体,然后把相关参数传递给业务的APP实体,通过业务APP对请求进行业务上的处理,处理完成之后,将返回的结果给到Gunicorn,Gunicorn对返回结果封装成HTTP response类型的TCP包,返回给发起请求的客户端·。

发表评论

电子邮件地址不会被公开。 必填项已用*标注