调用Ray.remote装饰的类方法报缺少param参数错误如何解决
报错原因
直接给类的实例方法加@ray.remote装饰器时,Ray不会自动绑定当前类实例的self参数。调用self.test.remote(param)时,传入的param会被识别为self形参的入参,方法定义里的param形参没有拿到对应值,最终触发缺少参数的报错。
解决方案
有两种可直接运行的修复方案,根据业务场景选择即可:
- 方案1:将类标记为Ray Actor(适合需要跨调用保留类内部状态的场景)
给类本身加@ray.remote装饰器,通过类名.remote()创建Actor实例,实例方法的self会被Ray自动绑定,修正后代码如下:
import ray
@ray.remote
class A:
def test(self, param):
print(param)
return {'r':1}
def run(self): datas = [self.test.remote(param) for param in range(10)] return datas
ray.init()
创建Actor实例
a = A.remote()
datas = ray.get(a.run.remote())
收集执行结果
rs = []
while len(datas):
done, datas = ray.wait(datas)
r = ray.get(done[0])
rs.append(r)
print(rs)
- 方案2:将远程方法改为静态方法(适合方法不依赖类实例属性的无状态场景) 去掉test方法的`self`参数,加上`@staticmethod`装饰器,不需要修改类本身的实例化逻辑,修正后代码如下: ```python import ray class A: @ray.remote @staticmethod def test(param): print(param) return {'r':1} def run(self): datas = [self.test.remote(param) for param in range(10)] return datas ray.init() a = A() datas = a.run() # 收集执行结果 rs = [] while len(datas): done, datas = ray.wait(datas) r = ray.get(done[0]) rs.append(r) print(rs)
注意:装饰器顺序不能写反,必须是
@ray.remote在@staticmethod上方,否则依然会触发参数错误。
内容的提问来源于stack exchange,提问作者tompal18
相关产品推荐
相关产品推荐

