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

Django中独立线程设置的全局坐标变量在视图中读取为None的问题

问题根因

Django 默认启动时会开启两个进程:一个负责监听代码变更实现热重载,另一个负责实际处理用户请求。生产环境如果使用 uWSGI、Gunicorn 等应用服务器开启多 worker 模式,也会存在多个独立进程。进程之间内存空间相互隔离,你在坐标生成线程所在进程写入的全局变量,处理请求的进程完全无法访问,这就是调用 get_coords 始终返回 None 的核心原因。
同时你当前 AppConfig 中启动线程的判断逻辑写反了,线程实际运行在热重载监听进程中,和处理请求的进程完全无关。

解决方案

1. 本地临时测试方案

关闭 Django 热重载功能,启动服务时添加 --noreload 参数,此时只会启动一个进程,你的原有代码即可正常运行:

python manage.py runserver --noreload

该方案仅适用于本地开发调试,不可用于生产环境。

2. 兼容生产环境的最小改动方案

使用 Django 内置的缓存框架实现跨进程数据共享,改动量极小:

步骤1:调整坐标读写逻辑

修改 CoordsTracker 类的 set_coords 和 get_coords 方法,使用缓存存储坐标值:

from django.core.cache import cache

class CoordsTracker:
    logger = logging.getLogger("CoordsTrackerLogger")

    # 其余原有方法保持不变

    @staticmethod
    def set_coords(new_coords):
        CoordsTracker.logger.debug("setting coords " + str(new_coords))
        # 写入缓存,timeout=None 表示永久有效,直到被新值覆盖
        cache.set('current_coords', new_coords, timeout=None)

    @staticmethod
    def get_coords():
        coords = cache.get('current_coords')
        CoordsTracker.logger.debug(coords)
        return coords

步骤2:修正线程启动逻辑

修改 AppConfig 中的启动条件,确保线程运行在处理请求的进程中:

def ready(self):
    # 只有处理请求的主进程RUN_MAIN值为true,在此处启动线程
    if os.environ.get('RUN_MAIN', None) == 'true':
        _thread.start_new_thread(CoordsTracker.launch_recognition, ())

步骤3(生产环境可选):配置共享缓存

如果生产环境开启了多 worker 模式,需要将默认的本地内存缓存替换为 Redis 等共享缓存服务,确保所有 worker 都能读取到同一个坐标值。

3. 更高可用性方案

如果坐标生成逻辑资源消耗较高,可将其拆分为独立运行的后台服务,通过 HTTP 接口、Socket 或者消息队列和 Django 服务通信,彻底避免进程耦合问题。

内容的提问来源于stack exchange,提问作者Zmur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:12:01