[英]How to dynamically set task routes over celery tasks?
我有一个 API 端点,它从用户那里获取一些数据并使用 1 个或多个 celery 工作人员处理它。
例如,有 3 个不同的任务:
@celery.task
def a(data):
res = do_a_work(data)
if res.status:
b.apply_async(res)
else:
return {'message': 'a task failed'}
@celery.task
def b(data):
res = do_b_work(data)
if res.status:
c.apply_async(res)
else:
return {'message': 'b task failed'}
@celery.task
def c(data):
res = do_c_work(data)
return {'result': res}
API 端点根据数据向a
或b
提交任务。
可能的流程:
a
-> b
-> c
-> 结果b
-> c
-> 结果a
-> 结果(如果状态a
False)a
-> b
-> 结果(如果b
状态为 False)b
-> 结果(如果b
状态为 False) 我计划使用 celery 链,我可以在其中定义应在该数据上执行哪些任务。 但问题是,如果任务a
或任务b
的状态为 False,我没有找到停止处理的方法。
另一种方法是从任务示例中的任务内部提交额外的任务,但问题是用户需要获取一个 task_id,然后他可以使用它来获取结果。
我可以使用第三种方法来解决这个问题吗?
chord
是执行此操作的正确方法,您只需重写do_a_work
和do_b_work
以引发异常并且不返回True
/ False
值。 重写这些函数以引发异常后,您可以使用和弦编写流程并设置错误。
打电话给a
你可能会做类似 beloe 的事情
chord(chord(a.s(data), b.s()).on_error(handle_a_error.s()), c.s()).on_error(handle_b_error.s())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.