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核心上,当它们访问同一块共享内存时,可能会出现缓存不一致的情况。以下是解决缓存不一致问题的几种方法:



解决缓存不一致问题的深度解析
缓存不一致问题是多核系统中数据同步的核心挑战,特别是在多进程共享内存的场景下。要彻底解决这个问题,需要从硬件到软件的多层协同设计。



缓存不一致的本质原因

image



缓存不一致的根本原因在于:

多级缓存结构:现代CPU有L1/L2/L3多级缓存

写操作延迟:CPU核心修改数据后不会立即写回主存

独立缓存副本:每个核心有自己的缓存副本

缺乏全局视图:单个核心不知道其他核心的缓存状态


image


image

image





posted on 2025-06-25 14:28  Angry_Panda  阅读(40)  评论(0)    收藏  举报

导航