Amazon ec2 从Ray.remote并行Python 3函数返回值时出现问题

Amazon ec2 从Ray.remote并行Python 3函数返回值时出现问题,amazon-ec2,parallel-processing,remote-access,ray,Amazon Ec2,Parallel Processing,Remote Access,Ray,我一直在使用Ray开发EC2并行云应用程序,用于设置集群和调度任务。然而,我有一个问题一直困扰着我。下面是一个非常简化的程序(在3名工人身上运行),对其进行了说明:- import numpy as np import subprocess as sp import boto3 import ray redadd=sp.check_output("hostname -I",shell=True).decode("utf-8").rstrip() ray.init(redis_address=r

我一直在使用Ray开发EC2并行云应用程序,用于设置集群和调度任务。然而,我有一个问题一直困扰着我。下面是一个非常简化的程序(在3名工人身上运行),对其进行了说明:-

import numpy as np
import subprocess as sp
import boto3
import ray

redadd=sp.check_output("hostname -I",shell=True).decode("utf-8").rstrip()
ray.init(redis_address=redadd+":6379")
pop=np.ones((3,3))

@ray.remote
def test_loop(n):                                           
    return n*pop[n,:]

for i in range(0,2): 
    print("iteration ",i)
    print(pop)
    if __name__=='__main__':
        ans=ray.get([test_loop.remote(n) for n in range(0,3)])
    print("ans ",ans)
    pop=2*pop

ray.shutdown()
其输出为:-

2019-07-03 23:35:06,078 WARNING worker.py:1337 -- WARNING: Not updating   worker name since `setproctitle` is not installed. Install this with `pip install setproctitle` (or ray[debug]) to enable monitoring of worker processes.
iteration  0
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
ans  [array([0., 0., 0.]), array([1., 1., 1.]), array([2., 2., 2.])]
iteration  1
[[2. 2. 2.]
 [2. 2. 2.]
 [2. 2. 2.]]
ans  [array([0., 0., 0.]), array([1., 1., 1.]), array([2., 2., 2.])]
忽略这个警告,问题在于pop的值是在test_循环的第一次迭代中读取的,同时返回三个乘积向量。但是,在下一次迭代中,pop的值增加了一倍,test_循环将忽略它并保留旧值。有人能解释一下这里发生了什么,以及如何让远程函数调用像我期望的那样工作吗

注意:我不认为这是一个作用域问题:pop是全局定义的,并且不会在测试循环中重新分配。

每个Ray“worker”都在一个单独的进程中运行(与线程相反),因此没有任何全局作用域的变量在所有worker之间共享

定义
test\u loop
远程函数时,函数定义将被序列化并发送到每个工作进程(以及
pop
数组)。因此,每个工作进程(除了主脚本之外)都有自己的
pop
副本。在主脚本中修改
pop
时,这不会影响
pop
数组的其他副本


如果希望工作进程的状态在方法运行时发生变化,您可能需要使用。

我明白了,谢谢。您认为Ray actor方法比将pop作为参数传递到test_loop更好吗?将
pop
作为参数传递到
test_loop
应该可以很好地工作。这确实有效,但不太好:如果pop太大,我会从某个pyarrow方法中得到一个错误。我将把这个问题作为一个单独的问题发表。