我当前的 celery 设置中有大约 10,000 个计划任务。我没有意识到计划任务是什么,并决定使用它们提前几个月发送后续电子邮件。
回过头来看,将任务安排在未来超过 1 小时可能永远不是一个好主意,因为每次重新启动 worker 时,它都必须重新接收来自 rabbitMQ 的每个计划任务,然后它们都只是坐在内存。
我的问题是,如果我必须撤销任务,它不会直接删除它。任务保留在内存中,但撤销队列现在包含任务的 ID。当它要执行时,celery 检查它是否被撤销,如果是,它会在此时撤销它。
但是,直到那时任务仍将保留在内存中,如果我随时重新启动我的 worker,撤销队列将被清除,因为我没有将其持久化。
如何从我的 celery worker 中永久删除任务?我基本上只需要向 rabbitMQ 发送一个确认消息,这样 rabbit 就会一劳永逸地删除它,如果我重新启动 celery,它就不会回来。
我查看了文档和源代码,并尝试自己在 shell 中执行此操作,但我无法找出向 rabbitMQ 确认任务然后永远弹出它的正确位置。
最佳答案
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
关于python - 如何从 rabbitMQ 中永久删除 celery 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24899772/