8

我觉得问起来有点愚蠢,但它似乎不在RQ 的文档中。我有一个包含数千个项目的“失败”队列,我想使用 Django 管理界面清除它。管理界面列出了它们并允许我单独删除和重新排队它们,但我不敢相信我必须潜入 django shell 才能批量执行。

我错过了什么?

4

4 回答 4

14

该类Queue有一个empty()可以像这样访问的方法:

import django_rq
q = django_rq.get_failed_queue()
q.empty()

但是,在我的测试中,这只清除了 Redis 中的失败列表键,而不是作业键本身。所以你的数千个工作仍然会占用 Redis 内存。为防止这种情况发生,您必须单独删除作业:

import django_rq
q = django_rq.get_failed_queue()
while True:
    job = q.dequeue()
    if not job:
        break
    job.delete()  # Will delete key from Redis

至于在管理界面中有一个按钮,您必须更改django-rq/templates/django-rq/jobs.html模板,扩展名admin/base_site.html,并且似乎没有任何自定义空间。

于 2013-10-30T13:37:00.097 回答
2

redis-cli 允许 FLUSHDB,非常适合我的本地环境,因为我生成了大量的工作。

通过有效的 Django 集成,我将进行更新。只需添加 0.02 美元。

于 2013-10-22T21:51:14.073 回答
0

您可以使用以下代码示例按名称清空任何队列:

import django_rq

queue = "default"
q = django_rq.get_queue(queue)
q.empty()

甚至为此使用 Django 命令:

import django_rq

from django.core.management.base import BaseCommand


class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument("-q", "--queue", type=str)

    def handle(self, *args, **options):
        q = django_rq.get_queue(options.get("queue"))
        q.empty()

于 2021-10-05T10:47:39.413 回答
0

由于@augusto-men 方法似乎不再起作用,这是另一种解决方案:

您可以使用原始连接删除失败的作业。只需遍历 rq:job 键并检查作业状态。

from django_rq import get_connection
from rq.job import Job

# delete failed jobs
con = get_connection('default')
for key in con.keys('rq:job:*'):
    job_id = key.decode().replace('rq:job:', '')
    job = Job.fetch(job_id, connection=con)
    if job.get_status() == 'failed':
        con.delete(key)
con.delete('rq:failed:default')  # reset failed jobs registry
于 2019-11-18T13:26:09.217 回答