Python 异常时中断光线执行
我最近开始与ray合作进行并行执行。在我的串行用例中,我有一个“超时”来停止循环的执行。我想知道如何使用ray做同样的事情 ray当前处理异常的方式是执行所有运行,收集执行期间发生的错误,并在最后显示消息Python 异常时中断光线执行,python,python-3.x,concurrency,ray,Python,Python 3.x,Concurrency,Ray,我最近开始与ray合作进行并行执行。在我的串行用例中,我有一个“超时”来停止循环的执行。我想知道如何使用ray做同样的事情 ray当前处理异常的方式是执行所有运行,收集执行期间发生的错误,并在最后显示消息 start_time = time.time() @ray.remote class Test(object): def __init__(self): self.res = None def run(self, c): time.slee
start_time = time.time()
@ray.remote
class Test(object):
def __init__(self):
self.res = None
def run(self, c):
time.sleep(0.25)
print(c)
self.res = c
if time.time()-start_time > 1:
print('Raise error at %d !' % c)
raise TimeoutError('Time out.....!!')
def get_res(self):
return self.res
test = [Test.remote() for _ in range(num_cpus)]
for i in range(num_cpus*2):
test[i % num_cpus].run.remote(i)
res = ray.get([t.get_res.remote() for t in test])
如果当前作业超时,是否可以中断ray执行下一个作业?是否有一种全局方式来中断执行?您所说的当前作业是什么意思?Ray是一个分布式环境,部分/所有任务都是并行运行的(而不是顺序运行的,就像在常规python循环中运行一样),因此没有“当前作业”的概念 在任何情况下,使用您的代码:
res = ray.get([t.get_res.remote() for t in test])
您正在等待最后一个任务完成(因此,在所有任务完成/失败之前,不会初始化“res”对象)
您可以做的是对代码稍加修改,并实现如下内容:
res = [t.get_res.remote() for t in test]
from ray.exceptions import RayTaskError
while len(res):
done_id, res= ray.wait(res)
try:
task_res = ray.get(done_id[0]) # debug/explore 'done_id' object to understand the results output (if task finished successfully or not)
except (RayTaskError, Exception):
ray.shutdown()