如何在多Python脚本及多Flask实例间共享字典变量
多独立运行Python脚本共享字典实现方案
独立启动、互不导入的Python脚本运行在各自独立的进程内存空间,没有办法直接访问对方内存里的原生字典对象,必须通过独立于所有业务进程的中间存储层实现数据同步。针对你在PythonAnywhere上部署多Worker Flask应用的场景,以下是可直接落地的方案:
优先推荐:Redis键值存储(适配性最高)
这是和你场景匹配度最高的方案,读写延迟极低,支持多进程高并发访问,数据更新后所有连接的实例都能即时读到最新值,PythonAnywhere平台本身就提供Redis服务支持,不需要自己额外搭建。
- 先安装依赖:
pip install redis - 写一个所有Flask实例都可以导入的共享字典封装,接口和原生Python字典基本一致:
# shared_dict.py import redis import json # 替换为你自己的Redis连接参数 redis_conn = redis.Redis( host="你的Redis实例地址", port=6379, password="你的Redis实例密码", db=0, decode_responses=True ) class SharedDict: def __getitem__(self, key): raw_value = redis_conn.get(key) return json.loads(raw_value) if raw_value is not None else None def __setitem__(self, key, value): redis_conn.set(key, json.dumps(value)) def __delitem__(self, key): redis_conn.delete(key) def __contains__(self, key): return redis_conn.exists(key) > 0 # 全局共享实例,所有脚本导入这个对象即可 main = SharedDict()
- 业务代码使用方式和你原来写的逻辑完全一致:
main1.py内容:
from shared_dict import main main["apples"] = "are fine" print(main["apples"]) main["apples"] = "are delicious"
main2.py内容:
from shared_dict import main input() # 等待main1完成值更新 print(main["apples"]) # 直接输出 are delicious
这个方案完全解决多Worker数据不一致的问题:不管请求被哪个Worker实例处理,读写的都是同一份Redis里的数据,不会出现各实例存的值不一样的情况。
轻量替代方案:SQLite数据库(无额外服务依赖)
如果不想使用Redis,也可以用Python自带的SQLite做共享存储,适合读多写少、数据量不大的场景。注意必须开启WAL模式,否则多进程并发读写容易出现锁库问题。
封装逻辑和上面的SharedDict类似,所有脚本连接同一个磁盘上的.db文件即可,不需要额外安装依赖。缺点是高并发写性能远低于Redis,写操作频繁的场景不推荐。
避坑提醒
- 不要尝试通过导入公共模块的全局变量实现共享:每个Python进程启动时会独立把模块加载到自己的内存空间,一个进程修改变量完全不会同步到其他进程,这就是你现在遇到的跨Worker数据不一致的根本原因。
- 不要用普通本地文件存JSON/CSV当共享存储:没有并发控制机制,多个进程同时写入时极易损坏文件,导致数据丢失、格式解析错误,生产环境不可用。
multiprocessing.Manager仅适用于同一个父进程拉起的多进程场景,对你这种独立启动的多Worker脚本完全无效,不用浪费时间尝试。
内容的提问来源于stack exchange,提问作者Nitlix
相关产品推荐
相关产品推荐

