控制和查询Celery中的任务



我已经使用Celery玩/工作了很长一段时间,作为一个"请运行此任务,如果失败,请重试几次,如果失败超过10次,请给我发电子邮件"的工具,它非常棒。它正是这样做的。

问题是,我被分配了一个问题,要求我能够运行几组任务,暂停/恢复它们并停止它们。

我知道Celery有队列,我可以调用add_consumercancel_consumer,但我注意到,即使我取消了一个使用者,工作者仍然会运行我们已经预取的所有任务。这意味着没有办法发出Pause *NOW*命令。只有一个Pause sometime later, when you're done doing stuff

解决方法是设计任务本身,以检查它们是否真的应该运行或休眠。

但另一个问题显示:?我实际上有多少任务?Celery将公开一种查询活动任务和计划任务的原始方法,但我注意到,处于RETRY状态的任务既不在活动列表中,也不在计划列表中,这意味着使用Celery查询任务总量很容易出错。

解决方法是使用Redis(或任何其他类型的数据库)并存储每个任务的状态;然后直接查询数据库,而不是查询Celery。

我想说的是,就我的经验而言,Celery实际上不允许任何细粒度的控制。它只是盲目地运行任务。

难道没有什么东西能让我更好地控制芹菜吗?它可以让我暂停/恢复/停止整个任务队列,并可能向我显示一些统计数据(how many tasks in total in this queue?how many active in this queue?how many in retry state in this queue?等…)

仅供参考:是的,我知道Flower是什么。不,Flower没有提供我想要的任何东西。Flower不会显示每个队列的任务,也不会让我立即暂停特定的队列。它最多允许我取消一个消费者,正如我所说,它将在预取的任务完成后停止执行任务。

据我所知,Celery不提供从框中暂停/恢复和停止任务的功能。

我认为,最好在编写任务代码之前先检查任务是否应该运行。并将这些信息存储在Redis中。

芹菜的控制能力

您可以查看:

  • Django Celery获取任务计数

最新更新