【发布时间】:2022-04-14 15:57:42
【问题描述】:
我正在使用RQ,并且我有一个包含数千个项目的failed 队列,以及我为测试创建的另一个test 队列,该队列现在是空的且未使用。我想知道如何从failed 队列中删除所有作业,并完全删除test 队列?
对于这个基本问题,我深表歉意,但我在 RQ docs 中找不到这方面的信息,而且我对 Redis 和 RQ 都是全新的......提前致谢!
【问题讨论】:
我正在使用RQ,并且我有一个包含数千个项目的failed 队列,以及我为测试创建的另一个test 队列,该队列现在是空的且未使用。我想知道如何从failed 队列中删除所有作业,并完全删除test 队列?
对于这个基本问题,我深表歉意,但我在 RQ docs 中找不到这方面的信息,而且我对 Redis 和 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/
在浏览器中打开。
选择队列
点击红色按钮“清空”
你就完成了。
如果你运行太旧的 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
【讨论】:
redis-cli 和 del 并使用 Python 中的 Redis。不幸的是,在任一方法中列出键似乎是在列出作业,而不是队列,尝试通过这些方法删除队列不起作用(我每次都返回 0)?
rq 库和可选rq-dashboard 的答案
qfail.empty() 时收到错误 redis.exceptions.ResponseError: unknown command 'EVALSHA'?
purgeq 重新放入我的问题中,它应该可以工作。试试看。
您现在可以在命令行中使用 rq 的 empty 选项:
/path/to/rq empty queue_name
所以你可以用它来清空任何队列,而不仅仅是失败的队列
【讨论】:
$ rq empty default --config myproject.config Error: no such option: --config
以上解决方案均无效 failed 队列未在队列下注册
所以我将所有失败的作业移到默认队列并使用
rq empty queue_name --url [redis-url]
【讨论】:
你只需登录redis并清除所有队列
登录
user@user:~$ redis-cli
输入此命令并回车
流水
你已经完成了
编辑:这将删除存储在 redis 中的所有内容
【讨论】:
监控工具rqinfo可以清空失败队列。
只要确保你有一个安装了rq 的活动虚拟环境,然后运行
$ rqinfo --empty-failed-queue
更多详情请见rqinfo --help。
【讨论】:
以下是使用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)
【讨论】:
- 2022 -
我也在为此苦苦挣扎,这是一段对我有用的代码。
它遍历队列名称(在我的例子中是“默认”和“低”),获取每个队列的所有失败作业并删除它们
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
【讨论】: