Python 在另一个参与者中保留“ActorHandler”以供以后使用时发生错误

Python 在另一个参与者中保留“ActorHandler”以供以后使用时发生错误,python,ray,Python,Ray,我希望一个远程类保留另一个远程类,以便以后可以调用它。下面的代码提供了一个示例 导入光线 ray.init() @雷,遥控器 班主任: 定义初始化(自): self.a=1 self.l=无 def设置(自我,学员): self.l=学习者 def步骤(自我): x=射线获取(自我l.p.remote(自我a)) 返回x @雷,遥控器 班级学员: 定义初始化(自): self.a=3 def步骤(自身、工作人员): 打印(ray.get(worker.step.remote()) def p(自

我希望一个远程类保留另一个远程类,以便以后可以调用它。下面的代码提供了一个示例

导入光线
ray.init()
@雷,遥控器
班主任:
定义初始化(自):
self.a=1
self.l=无
def设置(自我,学员):
self.l=学习者
def步骤(自我):
x=射线获取(自我l.p.remote(自我a))
返回x
@雷,遥控器
班级学员:
定义初始化(自):
self.a=3
def步骤(自身、工作人员):
打印(ray.get(worker.step.remote())
def p(自身,a):
返回a+自我
l=学习者远程()
w=Worker.remote()
w、 设置远程(l)
ray.get(l.step.remote(w))
ray.shutdown()

但是,该代码不起作用;它被卡住而没有发出任何错误。我知道问题的根源来自
Worker
中的
步骤
功能,但我不知道它为什么出错以及如何修复

首先,请注意,
ray.get
是一个阻塞调用。这意味着您的程序将被阻止,并且在
ray.get
功能成功之前无法转到下一行代码。(您可以通过向
remote
函数添加
timeout
参数来防止这种情况)

这是因为
l
被阻止,直到
worker.step.remote
完成(
ray.get(worker.step.remote()
)。调用
worker.step
方法时,它尝试调用
l.p.remote
将被阻止,直到
l.p
完成,因为
ray.get(self.l.p.remote(self.a)
。但正如您所看到的,
l
被阻止,无法运行任何代码。这意味着
l.p
将永远不会运行,直到
l.step
完成。下面是一个简单的图表供您理解

现在这两个worker都被阻止了,并且永远不会执行
l.step.remote
。这意味着您的驱动程序(Python脚本)也被阻止了

因此,整个程序是挂起的

那么如何解决这个问题呢

首先,我强烈建议您使用两个actor类互相等待的模式。即使在编写其他程序时,这通常也是一种不好的模式。当程序是多线程或异步的时,这可以解决

如果确实需要使用此模式,则可以使用async actor。async actor使用
wait
而不是
ray.get
,并且每个actor都不会被阻止,因为它们作为协同程序运行

EX)

导入光线
ray.init()
@雷,遥控器
班主任:
定义初始化(自):
self.a=1
self.l=无
def设置(自我,学员):
self.l=学习者
异步定义步骤(自):
x=等待自我l.p.remote(自我a)
返回x
@雷,遥控器
班级学员:
定义初始化(自):
self.a=3
异步定义步骤(自身、工作程序):
打印(等待worker.step.remote())
异步def p(自身,a):
返回a+自我
l=学习者远程()
w=Worker.remote()
w、 设置远程(l)
等待l步远程(w)
#ray.shutdown()