芹菜:中止或撤销和弦中的所有任务

2024-10-01 17:40:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我将以下设置与Redis broker和后端一起使用:

chord([A, A, A, ...])(B)

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

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

当然,我可以revoke()而不是abort()-处理它们,但问题是在这种情况下弦体(task B)不再执行了。在

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


Tags: 实例用户redisidtaskis标志broker
2条回答

你可以考虑让和弦任务监视A任务,而不是将任务本身和弦起来。我的意思是和弦将包含任务,这些任务每隔一段时间检查正在运行的任务(A)以查看它们是否已完成或被撤销。当所有这些都成功返回和弦,然后进入任务B

只需获取A所有实例的id列表并停止它们。在

想想这个简单的和弦

from celery import chord 

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

现在您可以使用

^{2}$

现在你可以做任何你想做的任务实例。例如,您可以撤消所有的,而不管其当前状态如何。在

from celery.task.control import revoke

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

revoke默认情况下只终止挂起的任务。但是如果您将terminate=True传递给它,它也会杀死正在执行的任务。在

此外,chord的回调函数将在其所有子任务成功执行后被调用。由于您正在取消chord的子任务,因此不会调用回调函数,并且chord任务会导致失败。因此,您必须重试回调任务。在

相关问题 更多 >

    热门问题