Python多进程:能否在两个Python Shell间共享dict?
在两个独立Python Shell间共享字典的方法
下面是几种可行的实现方案,适用于完全独立的Python进程(比如两个单独打开的Python Shell):
方法1:利用系统共享内存 + 序列化
通过共享内存存储序列化后的字典,两个进程分别读写共享内存区域。
第一个Shell(写入字典):
import multiprocessing import pickle # 创建固定大小的共享内存块(根据实际需求调整大小) shared_memory = multiprocessing.Array('c', 4096) # 待共享的字典 target_dict = {'status': 'running', 'count': 0} # 序列化字典并写入共享内存 serialized_data = pickle.dumps(target_dict) shared_memory[:len(serialized_data)] = serialized_data # 打印共享内存标识,第二个Shell需要此名称连接 print(f"共享内存名称:{shared_memory._name}")
第二个Shell(读取/修改字典):
import multiprocessing import pickle # 替换为第一个Shell输出的共享内存名称 shared_memory = multiprocessing.Array('c', name='此处填共享内存名称') # 读取并反序列化字典 serialized_data = bytes(shared_memory[:]) target_dict = pickle.loads(serialized_data) print("读取到的字典:", target_dict) # 修改后重新写入共享内存 target_dict['count'] += 1 updated_data = pickle.dumps(target_dict) shared_memory[:len(updated_data)] = updated_data
注意:共享内存大小需足够容纳序列化后的字典,避免数据截断;跨平台兼容性可能受系统共享内存机制影响。
方法2:用文件作为中间存储
通过读写本地文件实现字典共享,适合简单场景,需注意并发读写冲突。
第一个Shell(写入字典):
import json shared_dict = {'name': 'test', 'value': 100} # 写入JSON文件 with open('shared_dict.json', 'w', encoding='utf-8') as f: json.dump(shared_dict, f)
第二个Shell(读取/更新字典):
import json # 读取字典 with open('shared_dict.json', 'r', encoding='utf-8') as f: shared_dict = json.load(f) print("读取到的字典:", shared_dict) # 修改后写回 shared_dict['value'] += 50 with open('shared_dict.json', 'w', encoding='utf-8') as f: json.dump(shared_dict, f)
如果需要并发安全,可借助fcntl(Linux/macOS)或msvcrt(Windows)模块添加文件锁,防止同时写入导致数据损坏。
方法3:使用轻量级本地数据库
用SQLite这类嵌入式数据库存储键值对,天然支持多进程并发访问,适合需要持久化和高可靠性的场景。
第一个Shell(初始化并写入数据):
import sqlite3 # 连接数据库文件(不存在则自动创建) conn = sqlite3.connect('shared_dict.db') cursor = conn.cursor() # 创建键值对表 cursor.execute('CREATE TABLE IF NOT EXISTS key_value (key TEXT PRIMARY KEY, value TEXT)') # 插入字典数据 data = {'product': 'apple', 'price': '5.99'} for k, v in data.items(): cursor.execute('REPLACE INTO key_value VALUES (?, ?)', (k, v)) conn.commit() conn.close()
第二个Shell(读取/更新数据):
import sqlite3 conn = sqlite3.connect('shared_dict.db') cursor = conn.cursor() # 查询所有数据并转为字典 cursor.execute('SELECT key, value FROM key_value') rows = cursor.fetchall() shared_dict = {k: v for k, v in rows} print("读取到的字典:", shared_dict) # 更新数据 cursor.execute('REPLACE INTO key_value VALUES (?, ?)', ('price', '6.99')) conn.commit() conn.close()
SQLite会自动处理读写锁,多进程访问时无需额外加锁,数据持久化也更有保障。
内容的提问来源于stack exchange,提问作者chanp
相关产品推荐
相关产品推荐

