RQ - 清空和删除队列

19 投票
8 回答
27922 浏览
提问于 2025-04-18 14:28

我正在使用RQ,现在有一个failed队列,里面有成千上万的任务,还有一个我之前为了测试而创建的test队列,现在这个队列是空的,也没有再用。我想知道怎么才能把failed队列里的所有任务都删除掉,并且把test队列也彻底删掉?

抱歉问这个基础的问题,但我在RQ文档里找不到相关信息,而且我对Redis和RQ都完全是新手……提前谢谢大家!

8 个回答

1

监控工具 rqinfo 可以清空失败的队列。
只要确保你有一个正在运行的虚拟环境,并且里面安装了 rq,然后运行以下命令:

$ rqinfo --empty-failed-queue

想了解更多细节,可以查看 rqinfo --help

2

下面是如何使用 django_rq 来清除失败的任务记录:

import django_rq
from rq.registry import FailedJobRegistry

queue = django_rq.get_queue("your_queue_with_failed_jobs")
registry = FailedJobRegistry(queue=queue)

for job_id in registry.get_job_ids():
  registry.remove(job_id)
4

以上提到的解决办法都没用。

出现了“失败的队列没有在队列中注册”的问题。

所以我把所有失败的任务都移动到了默认队列,然后使用了以下命令:

rq empty queue_name --url [redis-url]

13

- 2016 -

现在你可以在命令行中使用 rq 的 empty 选项了:

/path/to/rq empty queue_name

这样你就可以清空任何队列,而不仅仅是失败的那个队列。

48

使用 rq 清理

RQ 提供了一些方法,可以让任何队列变为空:

>>> from redis import Redis
>>> from rq import Queue
>>> qfail = Queue("failed", connection=Redis())
>>> qfail.count
8
>>> qfail.empty()
8L
>>> qfail.count
0

如果你还有 test 队列的话,也可以用同样的方法。

使用 rq-dashboard 清理

首先安装 rq-dashboard:

$ pip install rq-dashboard

然后启动它:

$ rq-dashboard
RQ Dashboard, version 0.3.4
 * Running on http://0.0.0.0:9181/

在浏览器中打开。

选择你想要清理的队列。

点击红色的“清空”按钮。

这样就完成了。

Python 函数清除任务

如果你使用的 Redis 版本太旧,可能会导致 RQ 使用的命令失败,但你仍然可以通过 Python 代码删除任务:

这段代码需要一个队列的名字,里面有任务的 ID。

我们使用 LPOP 命令一个一个地请求任务 ID。

在任务 ID 前加上前缀(默认是 "rq:job:"),就得到了存储任务的键。

然后用 DEL 命令对每个键进行操作,就可以一个一个地清理数据库中的任务。

>>> import redis
>>> r = redis.StrictRedis()
>>> qname = "rq:queue:failed"
>>> def purgeq(r, qname):
...   while True:
...     jid = r.lpop(qname)
...     if jid is None:
...         break
...     r.delete("rq:job:" + jid)
...     print(jid)
...
>>> purge(r, qname)
a0be3624-86c1-4dc4-bb2e-2043d2734b7b
3796c312-9b02-4a77-be89-249aa7325c25
ca65f2b8-044c-41b5-b5ac-cefd56699758
896f70a7-9a35-4f6b-b122-a08513022bc5

撰写回答