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

如何用Python Ray实现多进程读写同一共享变量以提升性能?

用Ray实现单写多读的共享状态(替代multiprocessing Manager)

当然可以用Ray实现相同的单写多读共享状态功能,而且Ray在大量读进程场景下的性能表现会优于multiprocessing的Manager——因为Ray的Actor模式避免了Manager的单点IPC瓶颈,更适合高并发的读请求场景。

Ray实现代码示例

import ray

# 定义Actor类,作为共享状态的持有者
@ray.remote
class SharedState:
    def __init__(self):
        self.value = 0
    
    def update_value(self):
        self.value += 1
        return self.value
    
    def get_value(self):
        return self.value

# 写进程逻辑:持续调用Actor的更新方法
def write_to_state(state_actor):
    while True:
        ray.get(state_actor.update_value.remote())

# 读进程逻辑:持续获取并打印状态值
def read_from_state(state_actor):
    while True:
        value = ray.get(state_actor.get_value.remote())
        print(value)

if __name__ == '__main__':
    # 初始化Ray
    ray.init()
    
    # 创建共享状态Actor实例
    shared_state = SharedState.remote()
    
    # 启动写进程(用Ray的远程任务)
    write_task = ray.remote(write_to_state).remote(shared_state)
    
    # 可以启动多个读进程,这里示例启动2个,实际可按需扩展
    read_tasks = [ray.remote(read_from_state).remote(shared_state) for _ in range(2)]
    
    # 等待任务(因为是无限循环,实际不会结束,这里只是保持进程运行)
    ray.get([write_task] + read_tasks)

关键优势说明

  • 性能优化:multiprocessing的Manager通过单独的进程管理共享字典,每次读写都要经过跨进程通信的开销;而Ray的Actor是一个轻量级的服务进程,多个读进程的请求会被高效调度,在大量读场景下延迟更低、吞吐量更高。
  • 状态一致性:Actor的方法执行是串行的,天然保证了状态更新的原子性,不需要额外加锁就能避免竞态条件。
  • 扩展性强:如果需要增加更多读进程,只需要在read_tasks的列表推导中修改数量即可,Ray会自动处理资源调度。

和原multiprocessing代码的差异

  • 用Ray的Actor替代了Manager.dict作为共享状态容器
  • 用ray.remote装饰器标记远程任务和Actor,实现进程间的通信
  • Ray自动处理进程的启动和调度,不需要手动调用start()和join()

内容的提问来源于stack exchange,提问作者guim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:10:28