2013-08-07 43 views
5

我觉得有点傻,但它似乎不在documentation for RQ。我有一个'失败'队列中有成千上万的项目,我想用Django管理界面清除它。管理界面列出它们,并允许我单独删除并重新排队它们,但我不相信我必须深入到django shell来批量执行它。如何清除队列中的Django RQ作业?

我错过了什么?

回答

2

redis-cli允许FLUSHDB,当我生成bizzallion作业时,对我的本地环境非常有用。

随着工作的Django集成,我会更新。只需增加0.02美元。

+0

这不会影响非失败的作业吗? – Joe

+0

任何想到在调用flushdb之后重新启动我的django和redis服务器时,为什么现有作业会跳回队列? – andyzinsser

+0

@Joe一般是的,目前的工作将会消失。 –

13

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,而且似乎不给任何自定义空间。

+0

第二个片段非常庞大,我们无法弄清楚为什么我们在剩余密钥之前会发生内存泄漏。对于任何已经像我一样离职的人(因此无法通过python-rq访问密钥),请使用conn = redis.from_url(redis_url); conn.keys()方法让它们返回删除。 –

+0

@CharlesOffenbacher我不太清楚,如果我理解上面的代码片段。你是说我们需要运行上面的代码片段,但是先运行第二个代码片段,然后运行第一个代码片段?谢谢。 – William

+0

@罗伯特我相信你应该只使用第二个片段。第一个代码片段仅清除跟踪失败作业的列表,而不是自己实际失败的作业。 –