Flask开发服务器为何可处理远超uWSGI的高并发请求?
Flask开发服务器为何能处理高并发请求
测试代码
from flask import Flask import time app = Flask(__name__) @app.route('/test_speed', methods=['GET']) def test_speed(): time.sleep(3) return 'Blah'
核心原因分析
Flask开发服务器(底层由Werkzeug实现)在Flask 2.0及之后版本默认启用多线程模式:
- 启动开发服务器时,会创建主线程管理连接,同时为每个请求分配独立的工作线程处理。
- 你的测试代码里
time.sleep(3)属于阻塞IO操作,线程执行到sleep时会释放Python的GIL(全局解释器锁),让其他线程可以正常运行。因此1000个请求的sleep操作可以同时进行,最终几乎在3秒左右全部完成。
而你使用的uWSGI默认是单线程多进程模式:
- 配置的8个worker进程,每个进程同一时间只能处理一个请求,sleep期间进程会被完全阻塞,无法处理其他请求。所以1000个请求需要分
ceil(1000/8)批次处理,总耗时就是批次数量乘以3秒。
补充说明
- Flask开发服务器的多线程仅为开发便利设计,绝对不能用于生产环境,它在稳定性、负载能力和容错性上远不如uWSGI、Gunicorn这类生产级服务器。
- 若想让uWSGI实现类似的并发效果,可以通过配置
--threads参数(例如uwsgi --http :5000 --wsgi-file app.py --workers 8 --threads 100),让每个worker进程开启多个线程,这样单个worker就能同时处理多个阻塞IO请求,整体并发能力会显著提升。
内容的提问来源于stack exchange,提问作者DMcC
相关产品推荐
相关产品推荐

