如何从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
这样,所有任务将按计划运行,但不会执行任何操作。由于它们既未重命名也未删除,因此不会有任何错误。
显然,您应该更新代码以停止调度这些任务。稍后,将不再计划此类任务,因此您可以删除代码。