Flask实现异步非阻塞:基于Gevent的完整方案
本文详细介绍如何在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/ 正在执行耗时任务时,并不会阻塞对其他请求的处理。
以上内容即为本文的全部分享,希望能为各位的学习带来帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













