首页 > 解决方案 > 如何在 Ray 中使用全局变量

问题描述

我有一个看起来像这个更复杂版本的脚本:

import ray 

var1 = 0
var2 = 0

@ray.remote
def create(n): 
    global var1
    global var2
    for i in range(10): 
        var1 += 1
        var2 += 1

def create2(): 
    tasks = [create.remote(i) for i in range(20)]
    ray.get(tasks)

create2()

这个错误是因为 Ray 不允许以传统方式使用全局变量。我怎样才能解决这个问题?

标签: pythonparallel-processingglobal-variablesray

解决方案


.add1()一种解决方案是为任何一个 quasi -s创建一个方法,该方法global的实现将发送一个将 1 添加到main.

通过这种方式,由于对其他主要信号到达的强制信号处理,因此main能够保持增加任何准信号的最便宜(不是过于昂贵)的原子性。global[SERIAL][CONCURRENT]

这样做的可能工具是 ZeroMQPUSH/PULLnanomsg/或 pynng push/pullScalable Formal Communication Pattern 原型。

每个@ray.remote-decorated 执行都可以设置它自己{ PUSH | push }的信号路径的 -side,而main-side 或其 { thread | 基于进程 } 的衍生只是填充一个中央{ PULL | pull }端,位于一个恒定的.bind( <Transport_Class>:<Port#orOtherAdressSpecifier> )“收集服务”位置。先验已知的TransportClass目标地址的每个PUSH-ers ,其余的都是微不足道的。.connect()

根据您的需要,也可以使用更健壮、抗错误的方法。因此global,执行此操作或更复杂any:M+N的弹性投票、收集器或通用多代理分布式信令不需要 -s。


推荐阅读