Flask实现异步非阻塞:基于Gevent的完整方案

Luna
Luna
发布时间:2026-10-13| 4人浏览过
原创

本文详细介绍如何在Flask中实现异步非阻塞处理,通过引入gevent库和WSGIServer替代默认服务器,解决长时间耗时任务阻塞其他请求的问题。文中提供了从环境安装到代码修改的完整步骤,并附带GitHub示例代码,帮助开发者避免常见误区,提升Web应用性能。

官方文档中其实已提供相关解决方案,只是位置较为隐蔽。加之网络上存在不少准确性存疑的指南,曾导致我走了不少弯路(当然也可能源于个人理解偏差)。为了帮助其他开发者减少试错成本,同时也作为个人的技术备忘,特此整理此方案。

完整示例代码托管于:https://github.com/wskssau/my_notespace 下的 python/todo_app 目录。

核心解决方案采用 Flask 结合 gevent 库。

首先需安装 gevent 依赖库。

pip install gevent

随后对原有代码进行相应修改,以适配异步处理机制。

# 文件头部
from gevent import monkey
from gevent.pywsgi import WSGIServer

# 在玩websockets,可以无视之哈,有空贴下flask websockets实现哈
from geventwebsocket.handler import WebSocketHandler

import time

# gevent的猴子魔法
monkey.patch_all()

app = Flask(__name__)

app.config.update(
 DEBUG=True
)

@app.route('/asyn/1/', methods=['GET'])
def test_asyn_one():
 if request.method == 'GET':
  time.sleep(10)
  return 'hello asyn'


@app.route('/test/', methods=['GET'])
def test():
 return 'hello test'


if __name__ == "__main__":
 # app.run()
 http_server = WSGIServer(('', 5000), app, handler_class=WebSocketHandler)
 http_server.serve_forever()

部署运行后,建议先访问 /asyn/1/ 接口,再访问 /test/ 接口。此时可以明显观察到,当 /asyn/1/ 正在执行耗时任务时,并不会阻塞对其他请求的处理。

以上内容即为本文的全部分享,希望能为各位的学习带来帮助,也欢迎大家继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。