gunicorn+gevent使flask异步处理
作者:向前的步伐 / 发表: 2020年10月8日 00:19 / 更新: 2021年2月11日 11:00 / flask / 阅读量:1744
一,概述
Flask,Django都是自带着 WSGI server,当然性能都不好,自带的web server 更多的是测试用途。线上发布时,需要使用高性能的 wsgi server或者是联合nginx做uwsgi 。
greenlet是一个轻量级的协程库。gevent是基于greenlet的网络库。
guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。它的特点是与各个web框架结合紧密,部署特别方便。
在多核的机器上,可以通过guincorn启动多个worker来提高系统的使用率及性能。默认情况下使用的是同步阻塞的网络模型(-k sync),对于大并发量的引用并不太友好,此时需要使用gevent异步模式来提到系统的处理能力。
二、安装必要模块
1,安装guincorn:pip install gunicorn
2,安装异步模块gevent:pip install gevent
3,安装应用服务器框架flask:pip install flask
三、配置文件和应用
gunicore使用参数和相关的参数说明:
编写gunicore配置文件,使用gevent异步模式,guni.conf.py:
import os
import gevent.monkey
gevent.monkey.patch_all()
import multiprocessing
debug = True
loglevel = 'debug'
bind = '0.0.0.0:8800'
pidfile = './gunicorn.pid'
logfile = './debug.log'
accesslog = './access.log'
#启动的进程数
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gunicorn.workers.ggevent.GeventWorker'
x_forwarded_for_header = 'X-FORWARDED-FOR'
编写简单flask应用服务器,flask_server.py:
from flask import Flask, request, render_template
import json
app = Flask(__name__)
import logging
logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
filename='flask.log', # 将日志写入log_new.log文件中
filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
#a是追加模式,默认如果不写的话,就是追加模式
format=
'%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#日志格式
)
@app.route('/')
def index():
return 'hello world'
@app.route('/api/mes_res', methods=['POST'])
def test():
data = json.loads(request.get_data(as_text=True))
print(data)
session_key = data.get('session_key')
state = data.get('state')
msg = data.get('msg')
return {
'state': 0,
'msg': '接收成功'
}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8800, debug=True)
使用命令启动flask应用服务器:
gunicorn -c guni.conf.py flask_server:app
此时flask就是一个多进程异步处理的应用服务器了,可以有更好的性能。
四、打包到docker
首先创建需要下载的python模块,创建requirements.txt:
Flask==1.1.2
gevent==21.1.2
gunicorn==20.0.4
然后创建Dockerfile文件:
FROM python:3.7
WORKDIR /usr/src/Project
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["gunicorn", "flask_server:app", "-c", "./guni.conf.py"]
Dockerfile中的每一行都是一条命令
- FORM指定将在其中构建新镜像的基础容器镜像。 这样一来,你从一个现有的镜像开始,添加或改变一些东西,并最终得到一个派生的镜像【这里选择的是python2.7)】
- WORKDIR设置将要安装应用程序的默认目录【当我在上面创建Project用户时,会自动创建了一个主目录,所以现在我将该目录设置为默认目录。 最后在Dockerfile中的任何剩余命令执行以及运行容器时,其当前目录都会为这个默认目录】
- COPY将文件从你的机器复制到容器文件系统【它需要两个或更多参数,源文件/目录和目标文件/目录。 源文件必须与Dockerfile所在的目录相关, 目的地可以是绝对路径】
- RUN执行任意命令, 跟我们在shell下输入命令相似【创建一个虚拟环境,然后在其中安装requirements.txt文件中的所有Python依赖】
- CMD当然就是启动Falsk服务,demo是我们项目启动文件:启动应用名变量app
然后构建docker镜像:
使用命令:docker build -t project:latest .
构建完成之后,可以使用docker images这条命令获取本地镜像的列表:docker images
最后直接运行docker容易跑起服务:docker run -d -p 8800:8800 --name FalskServer project