我目前的芹菜设置有大约10,000个预定任务。我没有意识到计划的任务是什么,并决定用它们提前几个月发送后续电子邮件。
回顾过去,将来任务计划超过1小时可能永远不是一个好主意,因为每次重新启动工作人员时,必须从rabbitMQ重新接收每个计划任务,然后他们全部只是坐在记忆中。
我的问题是,如果我必须撤销任务,它不会删除它。任务保留在内存中,但撤销队列现在包含任务的ID。当它被执行时,芹菜会检查它是否被撤销,如果是,它将在此时撤销它。
但是,该任务在此之前仍将保留在内存中,如果我随时重新启动我的工作程序,则撤销队列将被清除,因为我没有使其保持持久性。
如何从芹菜工人那里永久删除任务?我基本上只需要向RabbitMQ发送一个已确认的信息,以便兔子一次性删除它,如果我重新启动芹菜,它就不会再回来了。
我查看了文档和源代码,并尝试在shell中自己完成,但我无法找到将任务交给rabbitMQ然后永久弹出它的适当位置。
答案 0 :(得分:2)
如果您只使用一个队列或一个任务,这很容易:
来自docs:
答案:您可以使用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,以便在工作人员启动时清除消息。
更新: 如果您有多个队列或任务
我不知道有任何方法可以在RabbitMQ中编辑它们,因为服务器不是为了访问/编辑/删除排队任务而构建的,但你总是可以在代码中禁用你的任务:
@task
def my_old_task()
pass
这样,所有任务都将按计划运行,但不会执行任何操作;因为它们既没有重命名也没有删除,所以你不会有任何错误。
显然,您应该更新代码以停止安排这些任务。一段时间后,将不再安排此类型的任务,因此您可以删除代码。
答案 1 :(得分:2)
1。 要正确清除等待任务的队列,您必须 必须 才能停止所有工作人员(http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are-still-messages-left-in-the-queue):
$ sudo rabbitmqctl stop
或(如果RabbitMQ /消息代理由Supervisor管理):
$ sudo supervisorctl stop all
2。 ...然后从特定队列中清除任务:
$ cd <source_dir>
$ celery amqp queue.purge <queue name>
3。 启动RabbitMQ:
$ sudo rabbitmqctl start
或(如果RabbitMQ由Supervisor管理):
$ sudo supervisorctl start all