【问题标题】:How to clear Django RQ jobs from a queue?如何从队列中清除 Django RQ 作业?
【发布时间】:2013-08-08 21:34:39
【问题描述】:

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

我错过了什么?

【问题讨论】:

  • 如果有人正在寻找特定于 django-rq>=2.0.0 的解决方案。 This link 可以帮忙。

标签: django python-rq


【解决方案1】:

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,并且似乎没有任何自定义空间。

【讨论】:

  • 第二个 sn-p 是巨大的,直到那个时候我们才弄清楚为什么我们有剩余键的内存泄漏。对于已经像我一样将作业出队的任何人(因此无法通过 python-rq 访问密钥),请使用 conn = redis.from_url(redis_url); conn.keys() 方法将它们恢复为删除。
  • @CharlesOffenbacher 我不太确定我是否理解上面的 sn-ps。您是说我们需要运行上面的两个代码 sn-ps 但先运行第二个 sn-p 再运行第一个 sn-p?谢谢。
  • @Robert 我相信你应该只使用第二个 sn-p。第一个代码 sn -p 只清除跟踪失败作业的列表,而不是实际失败的作业本身。
  • 这在 django-rq==2.1.0 中不再有效。 this post 中提到了一个变化。我尝试根据新的代码更改使用,但出现错误.. 还在同一帖子上发表评论以正确使用。希望很快能得到解决方案..
  • 我创建了一个 Django 管理命令来批量删除失败的 Django RQ 作业。 GitHub 的要点是 here
【解决方案2】:

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

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

【讨论】:

  • 这不会影响未失败的作业吗?
  • 知道为什么在调用 flushdb 后重新启动 django 和 redis 服务器后现有作业会跳回队列吗?
  • @Joe 一般是的,当前的工作将会消失。
  • @andyzinsser - 我已经运行了 Python 脚本,可以将更多作业排队(一个选项)。此外,您可以调用一堆 Python(FIFO 积压) - 有一个明确的队列,更多的行进... RQ 在某种程度上是一个黑匣子,当我想清除 100% 肯定时,我会停止所有 Python 进程(重新启动)以及当服务关闭时刷新和清除。请记住,您可以“查询”作业和流程以了解有关正在发生的事情的更多信息。我每天都学到更多。
【解决方案3】:

由于@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

【讨论】:

    【解决方案4】:

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

    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()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2020-09-27
      • 2018-05-04
      • 2011-07-02
      • 1970-01-01
      相关资源
      最近更新 更多