List 获奖名单';t使用Ray并行python进行更改

List 获奖名单';t使用Ray并行python进行更改,list,indexing,parallel-processing,assign,ray,List,Indexing,Parallel Processing,Assign,Ray,我的问题是,如果我重新分配列表中的某个项,使其在并行过程中发生,那么在并行过程完成后,更改将恢复到其原始状态 在下面的示例中,为了便于理解,进行了极大简化,我有一个函数将列表元素NoZeros[0]更改为“chicken”,还有一个函数将NoZeros[1]更改为“sandwich”。我甚至在第二个函数中加入了“全局”,只是为了证明这不是一个局部与全局的问题——它看起来像一个问题,但事实并非如此。正如运行程序时打印命令所显示的那样,列表元素实际上会发生变化。问题是,当在这些进程之后调用nozer

我的问题是,如果我重新分配列表中的某个项,使其在并行过程中发生,那么在并行过程完成后,更改将恢复到其原始状态

在下面的示例中,为了便于理解,进行了极大简化,我有一个函数将列表元素NoZeros[0]更改为“chicken”,还有一个函数将NoZeros[1]更改为“sandwich”。我甚至在第二个函数中加入了“全局”,只是为了证明这不是一个局部与全局的问题——它看起来像一个问题,但事实并非如此。正如运行程序时打印命令所显示的那样,列表元素实际上会发生变化。问题是,当在这些进程之后调用nozero时,nozero是它的开始,而不是“[“chicken”,“sandwich”]

我知道python的多处理程序包也有同样的问题,但解决方法是“向上一步”处理您不想返回的任何程序,并单击“manager.list()”“就在它前面。我的问题是,我一辈子都搞不清楚雷的等价物是什么。例如,在Python的多处理库中,您只需在更改NoZeros之前的某个地方编写NoZeros=manager.list(NoZeros),这将是它的结束,但我找不到Ray有什么等价物,或者是否有等价物

如何使用RAY并行更改列表?非常感谢


另外:请注意,此脚本可能会使您陷入循环,因为您可能会在并行进程完成之前打印NOZERO。这是我遇到的另一个bug,我希望大家能关注它,但这不是我的首要任务。我想指出的一点是,您可能希望在下一个单元格中运行print(NoZeros)(至少Jupyter具有此功能)。在python的多处理库中,只需执行“process.join()”,就可以解决有关结束进程的问题,这就引出了一个额外的问题:

附加问题:如何让ray.wait()工作;如果前面的命令(即使是并行命令)已完成,我如何告诉代码只继续执行下一个命令

'''


''

对于光线,可变的全局状态应该存在。例如,您可以执行以下操作:

@ray.remote
class ListActor:
    def __init__(self, l):
        self._list = l

    def get(self, i):
        return self._list[i]

    def set(self, i, val):
        self._list[i] = val

    def to_list(self):
        return self._list
然后,为了使用它,您可以将其作为参数传入(同样,您不应该依赖于全局变量)


你需要把你的问题缩小到一个阻碍你取得进步的问题,并就此提问。请参阅有关如何在此链接上发布问题的更多详细信息:“这是另一个我遇到麻烦的bug,请注意,但这不是优先事项——”我称之为缩小范围。
@ray.remote
class ListActor:
    def __init__(self, l):
        self._list = l

    def get(self, i):
        return self._list[i]

    def set(self, i, val):
        self._list[i] = val

    def to_list(self):
        return self._list
NoZeros = ListActor.remote([0,0])

@ray.remote
def Chicken(NoZeros):
    print("NoZeros[0] is",ray.get(NoZeros.get.remote(0)),"but will change to chicken")
    NoZeros.set(0, "chicken")
    print("Now, NoZeros[0] is",ray.get(NoZeros.get(0)))


# We need to make sure this function finishes executing before we print.
ray.get(Chicken.remote(NoZeros))

print(ray.get(NoZeros.to_list.remote()))