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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:24