2013-08-07 82 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

@羅伯特我相信你應該只使用第二個片段。第一個代碼片段僅清除跟蹤失敗作業的列表,而不是自己實際失敗的作業。 –