如何从rabbitMQ永久删除芹菜任务?


问题内容

我当前的芹菜装置中大约有10,000个预定任务。我不知道计划的任务是什么,因此决定使用它们提前几个月发送后续电子邮件。

回顾一下,将来安排一个任务超过一个小时可能永远不是一个好主意,因为每次您重新启动工作程序时,它都必须重新接收来自RabbitMQ的每个计划任务,然后它们就全部坐在内存中了。

我的问题是,如果我必须撤消任务,它不仅会删除它。任务保留在内存中,但是撤销队列现在包含任务的ID。当它准备执行时,芹菜会检查它是否被撤销,如果被撤销,它将在此时将其撤销。

但是,该任务将一直保持在内存中,直到那时,如果我随时重启我的工作器,由于我没有使其永久化,因此撤消队列将被清除。

如何从芹菜工作者中永久删除任务?
实际上,我只需要将确认的邮件发送回rabbitMQ,以便rabbit一劳永逸地将其删除,如果我重新启动celery,它将不会回来。

我查看了文档和源代码,并尝试在shell中自己完成此操作,但我无法确定将任务挂接到rabbitMQ并永久弹出的正确位置。


问题答案:

如果您只使用一个队列或一个任务,这很容易:

文档

答:您可以使用celery purge命令清除所有已配置的任务队列:

$ celery -A proj purge

或以编程方式:

>>> from proj.celery import app
>>> app.control.purge()
1753

如果只想从特定队列中清除消息,则必须使用AMQP API或celery amqp实用程序:

$ celery -A proj amqp queue.purge <queue name>

数字1753是已删除邮件的数量。

您还可以使用--purge参数启动worker ,以在worker启动时清除消息。

更新: 如果您有多个队列或任务

我不知道在RabbitMQ中编辑它们的任何方法,因为服务器不是以这种方式访问​​/编辑/删除排队的任务的,但是您始终可以在代码中禁用任务:

@task
def my_old_task()
   pass

这样,所有任务将按计划运行,但不会执行任何操作。由于它们既未重命名也未删除,因此不会有任何错误。

显然,您应该更新代码以停止调度这些任务。稍后,将不再计划此类任务,因此您可以删除代码。