python - 如何动态设置芹菜任务的任务路线?
问题描述
我有一个 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}
a
API端点b
根据数据提交任务。
可能的流程:
a
->b
->c
-> 结果b
->c
-> 结果a
-> 结果(如果a
状态为 False)a
->b
-> 结果(如果b
状态为 False)b
-> 结果(如果b
状态为 False)
我计划使用 celery 链,我可以定义应该在该数据上执行哪些任务。a
但问题是,如果任务或任务b
状态为 False ,我没有找到停止处理的方法。
另一种方法是从任务示例中的任务内部提交额外的任务,但问题是用户需要获取一个 task_id,稍后他可以使用它来获取结果。
我可以使用第三种方法来解决这个问题吗?
解决方案
Achord
是执行此操作的正确方法,您只需要重写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())
推荐阅读
- c++ - 包含我创建的相同头文件的链接错误 - C++
- android - 如何在滚动视图中使图像视图与网格视图一起滚动
- swiftui - Facebook 登录 + SwiftUI:登录/注销后不调用 loginButton 和 loginButtonDidLogOut
- java - 原因:org.springframework.beans.factory.BeanCreationException:创建名为“securityConfig”的bean时出错
- sql - 在 SQLite 中创建 BEFORE 触发器
- r - 如何从列表中每个响应的特定项目中创建一个数据框?
- python - 使用 PIL 显示图像会导致奇怪的色块
- swift - Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器
- python - 文件转换为exe不能生成条码
- oauth - 是否可以使用 Microsoft Graph API 访问令牌(不是应用程序的范围)获取用户的权限范围?