You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:15:46