我目前正在使用Redis进行工作流程,其中包含几个步骤。对于每个步骤,工作人员从队列中抢夺有效负载,并在完成后将其推送到下一个队列,下一个工作人员可以将其进一步处理。如果发生异常,则工作人员将任务放入特殊队列。
关于通过应用程序的流程的应用程序逻辑因此在于工作人员自己。我现在想切换到芹菜。
据我所知,在Celery中您可以使用子任务,但我无法看到您如何针对不同的条件(如异常和超时)表达您的特定错误处理。您是否应该使用不同的队列或使用子任务,以及在代码中会出现什么样?
答案 0 :(得分:2)
我现在已经更彻底地阅读了文档,并且另外做了一些测试,这有效:
问题是将任务串在一起,以便它们一个接一个地发生,但同时能够处理错误条件并“打破”流程并执行其他操作,而不仅仅是中止。
您可以使用 link 将任务串在一起,如果有额外的参数* link_error *,则会将其用于失败。阅读:
http://docs.celeryproject.org/en/latest/userguide/calling.html#linking-callbacks-errbacks 我做了这个:
res = add.apply_async((2, 2), link=mul.s(16), link_error=onerror.s())
三个任务是add,mul和onerror。添加两个数字,mul乘以两个数字。所以这将把2和2加在一起,然后总和将转移到下一步(mul)并乘以16。 但是,如果添加代码有错误,或者数据错误,或者发生其他错误但可检测到的情况,则添加抛出异常并且将运行onerror任务而不是mul。 onerror任务获取作业的uuid,并且可以在数据库后端查找作业,如果配置了这样的话。然后,onerror任务可以归档作业或发送电子邮件或其他任何内容。