我觉得问起来有点愚蠢,但它似乎不在RQ 的文档中。我有一个包含数千个项目的“失败”队列,我想使用 Django 管理界面清除它。管理界面列出了它们并允许我单独删除和重新排队它们,但我不敢相信我必须潜入 django shell 才能批量执行。
我错过了什么?
该类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
,并且似乎没有任何自定义空间。
redis-cli 允许 FLUSHDB,非常适合我的本地环境,因为我生成了大量的工作。
通过有效的 Django 集成,我将进行更新。只需添加 0.02 美元。
您可以使用以下代码示例按名称清空任何队列:
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()
由于@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