Python Dash多页应用全局变量存储的数据是否可保持持久有效?
Dash全局变量内存存储可靠性解答
现有实现的稳定性结论
如果仅在单进程、单用户场景下使用,你当前的实现完全可以放心使用,data_store不会被垃圾回收意外清理:
- Python的模块级全局变量在模块被导入后,只要应用进程未终止,引用计数始终大于0,GC不会主动回收对应的内存空间
- 你在
projects.py中导入data_store的操作会进一步增加该实例的引用计数,不存在被意外释放的可能
潜在风险说明
这套实现仅适合个人本地使用,一旦涉及多用户访问或者生产部署,会出现严重问题:
- 多进程部署数据不共享
若使用gunicorn、uWSGI等WSGI服务器开启多worker部署,每个worker会独立加载全部项目代码,拥有专属的内存空间和data_store实例,不同用户的请求分发到不同worker时,会出现数据不存在、数据不一致的问题。 - 多用户数据串扰
全局变量是所有访问用户共享的,用户A加载了自己的数据后,其他所有访问用户都能直接拿到A的数据,没有任何用户隔离性。 - 进程重启数据丢失
开发模式下的热重载、生产环境的服务重启,都会清空内存中所有data_store存储的数据。
优化方案
如果需要适配多用户、生产场景,可以根据数据量选择合适的方案:
- 单条数据量小于10MB:使用Dash自带的
dcc.Store组件,将数据序列化后存储在用户浏览器端,天然隔离不同用户的数据,不占用服务端内存 - 数据量较大:使用Redis、SQLite等独立存储服务持久化数据,也可以接入Dash底层Flask框架的
Flask-Caching插件实现服务端全局共享缓存
内容的提问来源于stack exchange,提问作者perza
相关产品推荐
相关产品推荐

