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

如何在Ray中使用全局变量?附报错代码及解决方案咨询

解决Ray远程函数中全局变量无法正常使用的问题

你的问题很典型——Ray的远程函数运行在独立的worker进程中,和主进程的内存空间完全隔离,传统全局变量根本没法实现跨进程的状态共享:每个worker会复制一份全局变量的副本,修改的只是这个副本,主进程完全拿不到更新后的值,这就是代码不符合预期的核心原因。

下面给你两种针对性的解决方案,根据你的实际需求选择:

方案1:用Ray Actor维护共享状态(适合多任务共享并修改同一状态)

如果你的目标是让多个远程任务共同累加var1和var2,Ray的Actor是最佳选择。Actor是有状态的远程对象,专门用来处理需要共享可变状态的场景,Ray会自动处理状态的同步和线程安全。

修改后的代码如下:

import ray

ray.init()

@ray.remote
class CounterActor:
    def __init__(self):
        # 在Actor内部封装需要共享的变量
        self.var1 = 0
        self.var2 = 0
    
    def increment(self):
        # 封装状态更新逻辑
        self.var1 += 1
        self.var2 += 1
    
    def get_final_values(self):
        # 提供获取最终状态的方法
        return self.var1, self.var2

@ray.remote
def create(counter_actor, n):
    # 远程任务通过调用Actor的方法更新共享状态
    for _ in range(10):
        counter_actor.increment.remote()

def create2():
    # 创建一个Actor实例
    counter = CounterActor.remote()
    # 启动20个远程任务
    tasks = [create.remote(counter, i) for i in range(20)]
    # 等待所有任务完成
    ray.get(tasks)
    # 获取最终累加结果
    final_var1, final_var2 = ray.get(counter.get_final_values.remote())
    print(f"最终var1: {final_var1}, var2: {final_var2}")

create2()
ray.shutdown()

这个方案中,所有任务的累加操作都是针对同一个Actor实例的调用,状态会被正确维护,最终你会得到var1=200、var2=200的预期结果(20个任务×每个任务累加10次)。

方案2:任务返回结果,主进程汇总(适合无状态独立任务)

如果你的场景不需要共享状态,只是每个任务独立计算后需要汇总结果,更简单的方式是让远程函数返回计算结果,然后在主进程里统一累加:

import ray

ray.init()

@ray.remote
def create(n):
    # 每个任务维护自己的局部变量,避免全局依赖
    var1 = 0
    var2 = 0
    for _ in range(10):
        var1 += 1
        var2 += 1
    # 返回当前任务的累加结果
    return var1, var2

def create2():
    tasks = [create.remote(i) for i in range(20)]
    # 获取所有任务的返回结果
    results = ray.get(tasks)
    # 主进程汇总所有结果
    total_var1 = sum(res[0] for res in results)
    total_var2 = sum(res[1] for res in results)
    print(f"最终var1: {total_var1}, var2: {total_var2}")

create2()
ray.shutdown()

这种方式更符合Ray无状态任务的最佳实践,避免了状态共享带来的复杂度,性能也更优——任务可以完全并行执行,不需要等待Actor的串行处理。

原代码问题的本质

再补充下为什么原代码行不通:主进程的var1和var2存储在主进程内存中,每个create.remote()启动的任务都会在单独的worker进程中运行,worker会复制一份全局变量的副本,但修改的只是这个副本,主进程的变量完全不会被更新,不同worker之间的副本也互不干扰,最后主进程的var1和var2还是初始的0,这显然不是你想要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:12:36