繁体   English   中英

如何在 celery 任务上动态设置任务路由?

[英]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 端点根据数据向ab提交任务。

可能的流程:

  • a -> b -> c -> 结果
  • b -> c -> 结果
  • a -> 结果(如果状态a False)
  • a -> b -> 结果(如果b状态为 False)
  • b -> 结果(如果b状态为 False)

我计划使用 celery 链,我可以在其中定义应在该数据上执行哪些任务。 但问题是,如果任务a或任务b的状态为 False,我没有找到停止处理的方法。

另一种方法是从任务示例中的任务内部提交额外的任务,但问题是用户需要获取一个 task_id,然后他可以使用它来获取结果。

我可以使用第三种方法来解决这个问题吗?

chord是执行此操作的正确方法,您只需重写do_a_workdo_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM