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
相关产品推荐
相关产品推荐

