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

Django部署Gunicorn+Nginx后全局字典值在视图间异常重置问题

问题原因

Gunicorn默认会启动多个worker进程处理请求,每个worker都有独立的内存空间,你定义的my_global_dict是每个进程自己的副本。当view1在某个worker进程里修改字典后,其他worker进程里的字典还是初始的空状态,所以view2访问时看到的是空字典。

开发环境的Django runserver是单进程模式,所有请求都在同一个进程里处理,所以全局变量能共享;Apache或IIS如果配置的是单进程/线程模型,或者用了共享内存机制,也不会有这个问题。

解决方案

1. 使用独立的外部存储(推荐生产环境)

用Redis、Memcached这类进程外的存储服务,所有worker进程都能访问同一个数据源。比如用Django的缓存框架:

# 先在settings.py配置缓存(以Redis为例)
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

# 视图里使用
from django.core.cache import cache
import pickle

def view1(request):
    # 存储实例,需先序列化
    cache.set('key0', pickle.dumps(myClass()))
    ...

def view2(request):
    obj_data = cache.get('key0')
    if obj_data:
        obj = pickle.loads(obj_data)
        print(obj)  # 能拿到view1存的实例
    ...

2. 使用多进程共享内存字典

用Python的multiprocessing.Manager创建跨进程共享的字典,需要在Django启动时初始化:

# 在你的app的__init__.py里初始化共享字典
from multiprocessing import Manager

my_global_dict = Manager().dict()

# 视图里直接使用
def view1(request):
    my_global_dict["key0"] = myClass()
    ...

def view2(request):
    print(my_global_dict)  # 所有worker都能看到修改后的值
    ...

注意:要确保Django启动时Manager只初始化一次,同时需要自行处理共享字典的并发安全问题,适合小流量场景。

3. 强制Gunicorn单进程运行(不推荐)

启动Gunicorn时指定--workers=1,这样所有请求都在同一个进程里处理,全局变量就能共享,但会严重限制并发能力,仅适合测试或极小流量的应用:

gunicorn --workers=1 your_project.wsgi:application

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:16