Flask调用OSMNX graph_from_point触发无限循环问题求助
排查与解决方法
1. 排查请求循环触发逻辑
- 确认
midpoint()函数内部是否不小心发起了对自身路由的请求(比如误写redirect或内部调用同视图函数),终端重复输出请求流程大概率是请求被反复触发,和OSMNX本身无关。 - 检查Flask路由定义,避免将
midpoint()绑定到多个路由,或路由规则歧义导致重复匹配。
2. 隔离OSMNX调用与Flask请求上下文
Flask请求上下文是线程本地的,自定义线程中直接调用OSMNX可能因上下文未清理引发异常,需手动隔离:
from flask import current_app def osmnx_task(origin): # 绑定应用上下文但避免携带请求上下文 with current_app.app_context(): G = osmnx.graph_from_point(origin, 3200, 'network', 'walk') # 后续节点查找、路径计算逻辑 return G
确保OSMNX的调用逻辑完全脱离请求上下文的干扰。
3. 修复线程管理问题
大量GraphThread未结束是线程未正确回收导致的资源堆积,需调整线程配置:
thread = GraphThread(target=osmnx_task, args=(origin,)) thread.daemon = True # 主线程结束时自动终止子线程 thread.start() thread.join() # 等待线程执行完成再继续后续逻辑
视图函数中必须等待线程执行完毕再返回响应,避免线程后台堆积占用资源。
4. 修复SQLAlchemy连接泄漏
连接池超时通常是连接未正确释放,需规范数据库操作:
from your_app import db def midpoint(): try: # 数据库操作逻辑 data = db.session.query(...).all() finally: db.session.remove() # 手动将连接归还到连接池
必要时可临时调整SQLAlchemy连接池配置(如增大pool_size),但核心是解决连接泄漏问题。
5. 验证OSMNX逻辑独立性
将OSMNX相关代码抽离成独立脚本测试,排除Flask环境干扰:
import osmnx as ox def test_osmnx(origin): G = ox.graph_from_point(origin, 3200, 'network', 'walk') # 节点查找、路径计算逻辑 return G if __name__ == "__main__": test_osmnx((39.9042, 116.4074)) # 替换为你的测试坐标
若脚本正常运行,说明问题出在Flask集成环节而非OSMNX本身。
6. 关闭Flask调试模式
调试模式的自动重载机制可能导致函数重复执行,若开启了debug=True,先关闭后测试是否还会出现无限循环。
内容的提问来源于stack exchange,提问作者Moises Herrera
相关产品推荐
相关产品推荐

