RQ - 清空和删除队列



我正在使用RQ,我有一个包含数千个项目的failed队列,以及我不久前创建的另一个用于测试的test队列,该队列现在是空的且未使用。我想知道如何从failed队列中删除所有作业,并完全删除test队列?

很抱歉这个基本问题,但我在RQ文档中找不到关于这方面的信息,而且我对Redis和RQ都是全新的。。。提前感谢!

使用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仪表板:

$ 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。

将前缀(默认情况下为"rq:job:"(添加到作业id中,我们就有了一个关键字,即存储作业的位置。

在每个键上使用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

-2016-

您现在可以使用rq的empty选项来形成命令行:

/path/to/rq empty queue_name

因此,您可以使用它清空任何队列,而不仅仅是失败的

上述解决方案均无效失败队列未在队列下注册

所以我将所有失败的作业移动到默认队列并使用

rq空队列名称--url〔redis url〕

以下是如何使用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)

监控工具rqinfo可以清空失败的队列
只需确保安装了rq的活动虚拟机,然后运行

$ rqinfo --empty-failed-queue

详见rqinfo --help

您只需登录redis并清除所有队列

登录

user@user:~$redis cli

输入该命令并点击回车

FLUSHALL

你完成了

编辑:这将删除redis中存储的所有内容

-2022-

我也在努力解决这个问题,这是一段对我有效的代码

它在队列名称上循环(在我的例子中,是"default"one_answers"low"(,获取每个队列的所有失败作业,并将其删除

import django_rq
from rq.registry import FailedJobRegistry
from redis import Redis
from rq.job import Job
from django.conf import settings
redis = Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT)
queues = ["default", "low"]
for q in queues:
    queue = django_rq.get_queue(q)
    registry = FailedJobRegistry(queue=queue)
    for job_id in registry.get_job_ids():
        job = Job.fetch(job_id, connection=redis)
        registry.remove(job)

默认情况下,'rq'作业以'rq:job'为前缀。因此,您可以使用以下命令从redis中删除这些作业,

redis-cli KEYS rq:job:* | xargs redis-cli DEL

最新更新