Ada*_*dam 5 python amqp rabbitmq celery django-celery
我当前的芹菜装置中大约有10,000个预定任务。我不知道计划的任务是什么,因此决定使用它们提前几个月发送后续电子邮件。
回顾过去,将来安排一个任务多于一个小时可能永远不是一个好主意,因为每次重新启动工作程序时,它都必须重新接收来自RabbitMQ的每个计划任务,然后它们都坐在内存中。
我的问题是,如果我必须撤消一项任务,它不仅会删除它。任务保留在内存中,但是吊销队列现在包含任务的ID。当它准备执行时,芹菜会检查它是否被撤销,如果被撤销,它将在此时将其撤销。
但是,该任务将一直保留在内存中,直到那时,如果我随时重启我的工作器,由于我没有使其永久化,因此撤消队列将被清除。
如何从芹菜工作者中永久删除任务?我基本上只需要将已确认的消息发送回rabbitMQ,以便rabbit一劳永逸地将其删除,如果我重新启动celery,它将不会回来。
我查看了文档和源代码,并尝试在shell中自己完成此操作,但我无法确定将任务挂接到rabbitMQ并永久弹出的正确位置。
如果您只使用了一个队列或一项任务,这很简单:
来自文档:
答:您可以使用 celery purge 命令清除所有配置的任务队列:
$ celery -A proj purge
Run Code Online (Sandbox Code Playgroud)
或以编程方式:
>>> from proj.celery import app
>>> app.control.purge()
1753
Run Code Online (Sandbox Code Playgroud)
如果您只想从特定队列中清除消息,则必须使用 AMQP API 或 celery amqp 实用程序:
$ celery -A proj amqp queue.purge <queue name>
Run Code Online (Sandbox Code Playgroud)
数字 1753 是已删除的消息数。
您还可以使用参数启动工作程序--purge,以在工作程序启动时清除消息。
更新: 如果您有多个队列或任务
我不知道有什么方法可以在 RabbitMQ 中编辑它们,因为服务器不是为了以这种方式访问/编辑/删除排队任务而构建的,但您始终可以在代码中禁用您的任务:
@task
def my_old_task()
pass
Run Code Online (Sandbox Code Playgroud)
这样所有的任务都会按计划运行,但不会执行任何操作;因为它们既没有被重命名也没有被删除,所以不会有任何错误。
显然,您应该更新代码以停止安排这些任务。一段时间后,将不会再安排此类任务,因此您可以删除该代码。
| 归档时间: |
|
| 查看次数: |
5890 次 |
| 最近记录: |