You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:23:12