Python 如何将远程函数映射到远程函数返回的可变长度iterable?

Python 如何将远程函数映射到远程函数返回的可变长度iterable?,python,ray,Python,Ray,我有一个远程函数,它“拆分”输入并返回一个iterable 然后我想在这个返回的iterable上映射一个远程函数(在构建图时,它是一个ObjectID)。大概是这样的: 导入光线 @雷,遥控器 def拆分(字符串): 返回字符串。拆分('-')) @雷,遥控器 def过程(子字符串): 打印('处理',子字符串) ray.init() substring=split.remote('some-variable-length-string') 对于子字符串中的项: 进程。远程(项目) 显然,这

我有一个远程函数,它“拆分”输入并返回一个iterable

然后我想在这个返回的iterable上映射一个远程函数(在构建图时,它是一个
ObjectID
)。大概是这样的:

导入光线
@雷,遥控器
def拆分(字符串):
返回字符串。拆分('-'))
@雷,遥控器
def过程(子字符串):
打印('处理',子字符串)
ray.init()
substring=split.remote('some-variable-length-string')
对于子字符串中的项:
进程。远程(项目)

显然,这不起作用(
TypeError:'ray.\u raylet.ObjectID'对象不可编辑
)。推荐的方法是什么?此拆分贴图缩减是管道中的常见模式。

光线远程函数返回对象引用,对象引用是。这很重要,因为它允许您在远程功能并行运行时执行其他操作。这意味着您试图迭代列表的承诺,而不是实际的列表本身。您需要调用
ray.get
,才能真正获取列表

您的代码中还有第二个类似的bug。由于
process.remote
也将并行运行,因此不能保证它在程序的其余部分完成之前完成,因此我们需要调用ray.get处理所有这些引用,以确保这些任务在程序结束之前完成

import ray

@ray.remote
def split(string):
    return string.split('-')

@ray.remote
def process(substring):
    print('Working on', substring)

ray.init()
substrings_ref = split.remote('some-variable-length-string')
process_refs = []
for item in ray.get(substrings):
    process_refs.append(process.remote(item))
ray.get(process_refs) # Notice the ray.get here too

Ray remote函数返回的对象引用不正确。这很重要,因为它允许您在远程功能并行运行时执行其他操作。这意味着您试图迭代列表的承诺,而不是实际的列表本身。您需要调用
ray.get
,才能真正获取列表

您的代码中还有第二个类似的bug。由于
process.remote
也将并行运行,因此不能保证它在程序的其余部分完成之前完成,因此我们需要调用ray.get处理所有这些引用,以确保这些任务在程序结束之前完成

import ray

@ray.remote
def split(string):
    return string.split('-')

@ray.remote
def process(substring):
    print('Working on', substring)

ray.init()
substrings_ref = split.remote('some-variable-length-string')
process_refs = []
for item in ray.get(substrings):
    process_refs.append(process.remote(item))
ray.get(process_refs) # Notice the ray.get here too