如何从队列中清除Django RQ作业?

时间:2013-08-07 13:22:10

标签: django python-rq

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

我错过了什么?

3 个答案:

答案 0 :(得分: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,并且似乎没有任何空间进行自定义。

答案 1 :(得分:2)

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

通过工作Django集成,我将更新。只需加0.02美元。

答案 2 :(得分: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
相关问题