Flask使用EventSource推送event-stream时后续请求卡Pending如何解决
问题根因
你遇到的请求Pending问题核心是Flask默认自带的开发服务器为单线程同步运行模式:/chart_data 路由返回的SSE响应使用了无限循环的生成器,只要客户端保持EventSource连接,这个请求就会长期占用唯一的工作线程,后续所有控制类请求无法被调度执行,就会一直处于Pending状态。
解决方案
- 开发环境临时修复:开启Flask多线程模式
启动应用时给run方法添加threaded=True参数,允许同时处理多个请求:
if __name__ == '__main__': app.run(threaded=True, debug=True)- 开发环境临时修复:开启Flask多线程模式
- 生产环境替换WSGI服务器
不要使用Flask自带的开发服务器,改用支持多 worker/异步的服务器,例如Gunicorn搭配gevent异步worker:
安装依赖:pip install gunicorn gevent
启动命令:gunicorn -w 4 -k gevent 你的启动文件名:app
上述命令会启动4个异步worker,可同时处理上百个SSE长连接,不会阻塞控制类请求。
- 生产环境替换WSGI服务器
- 优化SSE资源占用
当前每个客户端连接/chart_data都会新建一个KilnCommand实例、跑一个独立的无限循环拉取温度数据,会浪费服务器资源。建议把温度数据拉取逻辑做成全局单例,所有SSE连接共享同一份温度数据,减少不必要的IO和CPU消耗。
- 优化SSE资源占用
- 前端添加连接释放逻辑
页面关闭/跳转时主动关闭EventSource连接,避免无用的长连接占用服务器资源:
在你的show_jobs.html的脚本中添加如下代码:
window.addEventListener('beforeunload', () => { source.close() })- 前端添加连接释放逻辑
内容的提问来源于stack exchange,提问作者moonstripe
相关产品推荐
相关产品推荐

