反模式:使用 ray.get 按提交顺序处理结果会增加运行时间#
TLDR: 避免使用 ray.get()
按提交顺序处理独立结果,因为结果可能以不同于提交顺序的顺序准备好。
一批任务被提交,我们需要在它们完成后分别处理结果。如果每个任务完成所需的时间不同,而我们按提交顺序处理结果,可能会浪费时间等待所有较慢(落后)的早期任务完成,而较快的后期任务已经完成。
相反,我们希望使用 ray.wait()
按照任务完成的顺序来处理它们,以加快总完成时间。
代码示例#
import random
import time
import ray
ray.init()
@ray.remote
def f(i):
time.sleep(random.random())
return i
# Anti-pattern: process results in the submission order.
sum_in_submission_order = 0
refs = [f.remote(i) for i in range(100)]
for ref in refs:
# Blocks until this ObjectRef is ready.
result = ray.get(ref)
# process result
sum_in_submission_order = sum_in_submission_order + result
# Better approach: process results in the completion order.
sum_in_completion_order = 0
refs = [f.remote(i) for i in range(100)]
unfinished = refs
while unfinished:
# Returns the first ObjectRef that is ready.
finished, unfinished = ray.wait(unfinished, num_returns=1)
result = ray.get(finished[0])
# process result
sum_in_completion_order = sum_in_completion_order + result
其他与 ray.get()
相关的反模式包括:
不必要的ray.get