python – Celery:在和弦中中止或撤销所有任务

我使用Redis代理和后端的以下设置:

和弦([A,A,A,…])(B)

>任务A进行一些检查.它使用AbortableTask作为基础并定期检查task.is_aborted()标志.
>任务B通知用户计算结果

用户可以中止A任务.不幸的是,在所有任务A实例上调用AbortableAsyncResult(task_a_id).abort()时,只有活动的实例被中止.工作人员尚未收到的任务的状态将更改为ABORTED,但仍会处理它们,并且is_aborted()标志返回False.

我当然可以撤销()暂挂任务而不是abort() – 但是问题在于,在这种情况下,和弦体(任务B)不再执行了.

如何停止所有挂起和正在运行的任务A实例,同时仍然确保任务B运行?

最佳答案 只需获取A的所有实例的id列表并停止它们.

考虑一下这个简单的和弦

from celery import chord 

my_chord = chord(a.si() for i in range(300))(b.si())

现在,您可以使用my_chord实例获取子任务列表(任务的所有实例)

for taks in my_chord.parent.subtasks:
    print(task.id)

现在,您可以对这些任务实施做任何想做的事情.例如,无论当前状态如何,您都可以撤销所有状态.

from celery.task.control import revoke

for task in my_chord.parent.subtasks:
    revoke(task.id, terminate=True)

默认情况下撤消只会导致挂起的任务.但是如果你将terminate = True传递给它,它也会杀死正在执行的任务.

此外,在所有子任务成功执行后,将调用和弦的回调函数.由于您要取消和弦的子任务,因此不会调用回叫功能,并且和弦任务会导致失败.因此,您必须重试回调任务.

点赞