我正在使用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