运行Gunicorn源码

达芬奇密码2018-07-30 13:19

需求

想要看一下Gunicorn的代码,运行一下Gunicorn,了解一下它的运行机制, 那么如何如行呢?

下载代码

从Github上下载源码,

https://github.com/benoitc/gunicorn

Gunicorn代码目录介绍

执行

cd gunicorn/gunicorn

进入目录。

查看当前目录结构如下:

.
├── app
│   ├── base.py
│   ├── base.pyc
│   ├── djangoapp.py
│   ├── django_wsgi.py
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── pasterapp.py
│   ├── wsgiapp.py
│   └── wsgiapp.pyc
├── arbiter.py
├── arbiter.pyc
├── argparse_compat.py
├── _compat.py
├── _compat.pyc
├── config.py
├── config.pyc
├── debug.py
├── debug.pyc
├── errors.py
├── errors.pyc
├── glogging.py
├── glogging.pyc
├── http
│   ├── body.py
│   ├── body.pyc
│   ├── errors.py
│   ├── errors.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── message.py
│   ├── message.pyc
│   ├── parser.py
│   ├── parser.pyc
│   ├── _sendfile.py
│   ├── _sendfile.pyc
│   ├── unreader.py
│   ├── unreader.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
├── __init__.py
├── __init__.pyc
├── instrument
│   ├── __init__.py
│   └── statsd.py
├── management
│   ├── commands
│   │   ├── __init__.py
│   │   └── run_gunicorn.py
│   └── __init__.py
├── pidfile.py
├── pidfile.pyc
├── reloader.py
├── reloader.pyc
├── selectors.py
├── six.py
├── six.pyc
├── sock.py
├── sock.pyc
├── util.py
├── util.pyc
└── workers
    ├── async.py
    ├── base.py
    ├── base.pyc
    ├── _gaiohttp.py
    ├── gaiohttp.py
    ├── geventlet.py
    ├── ggevent.py
    ├── gthread.py
    ├── gtornado.py
    ├── __init__.py
    ├── __init__.pyc
    ├── sync.py
    ├── sync.pyc
    ├── workertmp.py
    └── workertmp.pyc

注意

  • app/wsgiapp.py是运行Gunicorn的入口

  • arbiter.py 是主进程的逻辑模块

  • http/ 负责对HTTP请求和相应的处理

  • workers/ 包含了Gunicorn支持的多种工作者进程

启动Gunicorn

进入到app/目录下, 创建app.py,内容如下:

# -*- coding: utf-8 -*-

from flask import Flask, jsonify, session, request

app = Flask(__name__)
app.secret_key = 'super secret key'

@app.route('/', methods=['GET'])
def index():
    return jsonify({'k': 'v'})

@app.route('/test', methods=['GET'])
def test():
    num = request.args.get('num')
    old = session.get('num') or None
    session['num'] = num
    return jsonify({'ret': old})


if __name__ == '__main__':
    print 'Started'
    app.run(host='0.0.0.0')

在app/目录下执行:

python wsgiapp.py app:app

即可看到相应的启动输出:

[2016-10-15 16:56:48 +0000] [10180] [INFO] Starting gunicorn 19.6.0
[2016-10-15 16:56:48 +0000] [10180] [INFO] Listening at: http://127.0.0.1:8000 (10180)
[2016-10-15 16:56:48 +0000] [10180] [INFO] Using worker: sync
[2016-10-15 16:56:48 +0000] [10185] [INFO] Booting worker with pid: 10185

或者使用pdb来跟踪代码, 使用:

 python -m pdb wsgiapp.py app:app

即可深入了解Gunicorn的启动机制了。

本文来自网易实践者社区,经作者王一兵授权发布。