python的多进程共享内存操作出现的同步不一致问题 —— 多进程操作的缓存不一致问题
相关地址:
https://openi.pcl.ac.cn/devilmaycry812839668/SyncVectorEnv
点击查看代码
from multiprocessing import Process
from multiprocessing import Queue
import numpy as np
from numpy import ndarray
from typing import Callable, Dict, List, Tuple
"""目前主要支持gymnasium环境,gym环境未成功支持"""
from gymnasium import Env
# try:
# import gymnasium as gym
# except ImportError:
# import gym
# from gym import Env
"""
多进程实现:
以子进程的方式运行游戏环境并与主进程交互数据
"""
class ChildEnv(Process):
def __init__(self, id:int, env_fns:List[Callable[[], Env]], shared_data:Dict[str, ndarray], queue:Queue, barrier:Queue):
super(ChildEnv, self).__init__()
self.id = id # 子进程的编号
self.env_fns = env_fns
self.actions = shared_data["actions"]
self.rewards = shared_data["rewards"]
self.next_obs = shared_data["next_obs"]
self.next_obs_truncated = shared_data["next_obs_truncated"]
self.terminated = shared_data["terminated"]
self.truncated = shared_data["truncated"]
self.queue = queue
self.barrier = barrier
def run(self):
super(ChildEnv, self).run()
envs = [env_fn() for env_fn in self.env_fns]
for i, env in enumerate(envs):
self.next_obs[i], _ = env.reset()
# print(self.id, i, env)
self.barrier.put(True)
while True:
instruction = self.queue.get()
if instruction is None:
break
for i, (env, action) in enumerate(zip(envs, self.actions)):
next_obs, reward, terminated, truncated, _ = env.step(action)
if terminated:
self.next_obs[i], _ = env.reset()
elif truncated:
self.next_obs_truncated[i] = next_obs
self.next_obs[i], _ = env.reset()
else:
self.next_obs[i] = next_obs
self.rewards[i] = reward
self.terminated[i] = terminated
self.truncated[i] = truncated
self.barrier.put(True)
缓存不一致问题(Cache Coherency)是多核/多CPU系统中多个处理器缓存之间的数据一致性问题。在Python多进程编程中,由于每个进程可能运行在不同的CPU核心上,当它们访问同一块共享内存时,可能会出现缓存不一致的情况。以下是解决缓存不一致问题的几种方法:
解决缓存不一致问题的深度解析
缓存不一致问题是多核系统中数据同步的核心挑战,特别是在多进程共享内存的场景下。要彻底解决这个问题,需要从硬件到软件的多层协同设计。
缓存不一致的本质原因

缓存不一致的根本原因在于:
多级缓存结构:现代CPU有L1/L2/L3多级缓存
写操作延迟:CPU核心修改数据后不会立即写回主存
独立缓存副本:每个核心有自己的缓存副本
缺乏全局视图:单个核心不知道其他核心的缓存状态



本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2025-06-25 14:28 Angry_Panda 阅读(40) 评论(0) 收藏 举报
浙公网安备 33010602011771号