0x01 前言
Flask默认是单进程且单线程的,及时关闭debug也无法处理多并发的情况,新手党很容易在这里踩坑,如果想部署上线,还是要开启多进程或者多线程的,否则将无法处理并发请求,导致请求超时。
下面看个例子,当flask app.run默认启动时,我用用浏览器快速访问一个延时两秒的接口(参数不同):
1 2 |
[Process 91047] [Thread 123145344790528] 2020-09-29 14:22:27 _internal.py _log[line:122] [Process 91047] [Thread 123145344790528] 2020-09-29 14:22:29 _internal.py _log[line:122] |
可见,第二个请求是等第一个请求结束后才处理的,所以可以确定是单进程、单线程的处理方式。
0x02 Flask开启自带的多线程或多进程
开启多线程:
1 |
app.run(debug=debug, host='0.0.0.0', port=8082, threaded=True) |
开启多进程
1 |
app.run(debug=debug, host='0.0.0.0', port=8082, processes=10) |
需要注意的是,多进程和多线程不可以同时开启,且需要关闭debug。下面再来看下请求结果
1 2 |
[Process 91295] [Thread 123145513381888] 2020-09-29 14:29:01 _internal.py _log[line:122] [Process 91295] [Thread 123145509175296] 2020-09-29 14:29:01 _internal.py _log[line:122] |
可以看到,已经可以并发处理了。
关于多进程方式,processes参数是指定进程数量,当并发度大于请求数量的时候仍然会阻塞。
0x03 使用gunicorn多进程启动Flask
安装gunicorn
1 |
pip install gunicorn |
安装完成后可以使用下面的命令来启动
1 |
gunicorn 入口文件名:app |
这里的app是Flask(__name__)返回值得接收变量
gunicorn支持配置文件启动,如下例子:
1 2 3 4 5 6 7 8 9 10 11 |
# gunicorn.conf bind = "0.0.0.0:5000" workers = 4 backlog = 2048 pidfile = "log/gunicorn.pid" accesslog = "log/access.log" errorlog = "log/debug.log" timeout = 600 debug=False capture_output = True |
启动命令
1 |
gunicorn --config gunicorn.conf main:app |