






















$ mkdir gunicorn_demo
$ cd gunicorn_demo
构建一个最基本的 Flask 项目
app.py 文件
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return 'Hello World'

Gunicorn 是目前使用最广泛的高性能的 Python WSGI(WEB Server Gateway interface)服务器,移植自 Ruby 的 Unicorn 项目,使用 pre-fork worker 模式,具有简单、易用、轻量级、低资源消耗和高性能等特点。
什么是 pre-fork worker 模型?
worker 模型意味着:这个模型有一个中心主控 master进程,由它来管理一组 worker 进程;这个主控进程并不知晓任何客户端,所有的请求和响应都完全是由多个 worker 进程来处理的。fork 意味着:worker 进程是由 master 进程 fork (复刻)出来的;pre- 意味着:在任何客户端请求到来之前(程序启动的时候),就已从 master 进程 fork 出了多个 worker 进程,坐等请求到来。存放在 /gunicorn/workers/__init__.py 文件中
以下针对每一个 worker 进程中的工作模式
sync:单进程单线程的工作模式,而且还是同步的,也就是说当前请求未处理结束,其他请求只能排队等待eventlet:单进程单线程多协程的工作模式(异步)gevent:单进程单线程多协程的工作模式(异步)gthread:单进程多线程的工作模式... 还有一些其他工作模式,具体请看官方文档
注意事项:
(2 * CPU) + 1sync 模式单进程多线程和 单进程单线程多协程 这两种工作方式是可以的,但是 单进程多线程多协程 目前是不可以的| 参数名 | 描述 | 默认值 |
|---|---|---|
更具体的内容请查看文档:Gunicorn Settings
$ gunicorn --workers=5 app:app
以上开启了 5 个 worker 进程,默认是以 sync 的工作模式运行的,也就是 同步 的工作模式
第一个 app 指的是 app.py 文件名
第二个 app 指的是文件中的实例变量 app
$ gunicorn --workers=5 --threads=2 app:app
# 等同于
$ gunicorn --workers=5 --threads=2 --worker-class=gthread app:app
开启了 5 个 workder 进程,每个进程中有两个线程,这里最大的并发请求数就是 worker * 线程数 = 10
$ gunicorn --workers=5 --worker-connections=1000 --worker-class=gevent app:app
开启了 5 个 workder 进程,每个进程中默认是一个线程,然后开启的协程数为 1000,在这种情况下,能够处理的最大并发请求数量为 worker * 协程数 = 5000
在项目根目录上创建 gunicorn_config.py 文件,内容如下:
"""gunicorn + gevent 的配置文件"""
# 多进程
import multiprocessing
# 绑定ip + 端口
bind = '0.0.0.0:5000'
命令行运行:
$ gunicorn -c gunicorn_config.py app:app
app.py 和 Dockerfile 文件在同一个目录下
Dockerfile 文件的内容
# 指定下载 python 版本,说明该镜像以哪个镜像为基础
FROM python:3.8.5
此时的文件结构为:
├── gunicorn_demo
│ ├── app.py
│ ├── Dockerfile
│ ├── gunicorn_config.py
# 构建镜像
docker build -t="gunicorn_demo" .
或
docker build -t gunicorn_demo .
# 使用镜像,启动容器
docker run -d -p 5000:5000 gunicorn_demo
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。