【问题标题】:RQ - Empty & Delete QueuesRQ - 清空和删除队列
【发布时间】:2022-04-14 15:57:42
【问题描述】:

我正在使用RQ,并且我有一个包含数千个项目的failed 队列,以及我为测试创建的另一个test 队列,该队列现在是空的且未使用。我想知道如何从failed 队列中删除所有作业,并完全删除test 队列?

对于这个基本问题,我深表歉意,但我在 RQ docs 中找不到这方面的信息,而且我对 Redis 和 RQ 都是全新的......提前致谢!

【问题讨论】:

    标签: python redis python-rq


    【解决方案1】:

    使用 rq 清理

    RQ 提供了使任何队列为空的方法:

    >>> from redis import Redis
    >>> from rq import Queue
    >>> qfail = Queue("failed", connection=Redis())
    >>> qfail.count
    8
    >>> qfail.empty()
    8L
    >>> qfail.count
    0
    

    您可以对 test 队列执行相同的操作,如果它仍然存在的话。

    使用rq-dashboard 清理

    安装 rq-dashboard:

    $ pip install rq-dashboard
    

    开始吧:

    $ rq-dashboard
    RQ Dashboard, version 0.3.4
     * Running on http://0.0.0.0:9181/
    

    在浏览器中打开。

    选择队列

    点击红色按钮“清空”

    你就完成了。

    Python 函数清除作业

    如果你运行太旧的 Redis,在 RQ 使用的命令上失败,你仍然可能会成功删除 python代码的工作:

    代码采用队列的名称,作业 ID 在哪里。

    使用 LPOP,我们要求作业 ID 加一。

    在作业 ID 中添加前缀(默认为“rq:job:”)我们有一个键,作业存储在哪里。

    对每个键使用 DEL,我们逐个清除数据库作业。

    >>> import redis
    >>> r = redis.StrictRedis()
    >>> qname = "rq:queue:failed"
    >>> def purgeq(r, qname):
    ... while True:
    ...     jid = r.lpop(qname)
    ...     if jid is None:
    ...         break
    ...     r.delete("rq:job:" + jid)
    ...     print jid
    ...
    >>> purge(r, qname)
    a0be3624-86c1-4dc4-bb2e-2043d2734b7b
    3796c312-9b02-4a77-be89-249aa7325c25
    ca65f2b8-044c-41b5-b5ac-cefd56699758
    896f70a7-9a35-4f6b-b122-a08513022bc5
    

    【讨论】:

    • 非常感谢您的详细回复。根据您的回答,我尝试使用 redis-clidel 并使用 Python 中的 Redis。不幸的是,在任一方法中列出键似乎是在列出作业,而不是队列,尝试通过这些方法删除队列不起作用(我每次都返回 0)?
    • @Cian 我重写了使用rq 库和可选rq-dashboard 的答案
    • 谢谢 Jan,非常感谢您的意见。使用 rq 我在调用 qfail.empty() 时收到错误 redis.exceptions.ResponseError: unknown command 'EVALSHA'?
    • @Cian 你有什么版本的 Redis? EVALSHA 从 2.6.0 开始就存在,我有 2.8.6 版本。
    • @Clan 我将清除功能purgeq 重新放入我的问题中,它应该可以工作。试试看。
    【解决方案2】:

    - 2016 年-

    您现在可以在命令行中使用 rq 的 empty 选项:

    /path/to/rq empty queue_name
    

    所以你可以用它来清空任何队列,而不仅仅是失败的队列

    【讨论】:

    • 我试过$ rq empty default --config myproject.config Error: no such option: --config
    • 如果不使用配置标志会发生什么?你有什么 RQ 版本?
    • 没有配置标志一切都按预期工作。 0.7.1版
    【解决方案3】:

    以上解决方案均无效 failed 队列未在队列下注册

    所以我将所有失败的作业移到默认队列并使用

    rq empty queue_name --url [redis-url]

    【讨论】:

      【解决方案4】:

      你只需登录redis并清除所有队列

      登录

      user@user:~$ redis-cli

      输入此命令并回车

      流水

      你已经完成了

      编辑:这将删除存储在 redis 中的所有内容

      【讨论】:

      • 这当然会从 redis 中删除所有内容,而不仅仅是 RQ 队列。所以不是一个很好的答案。
      • @FuzzyAmi 是的,你完全正确。我必须提到,我将添加该信息
      【解决方案5】:

      监控工具rqinfo可以清空失败队列。
      只要确保你有一个安装了rq 的活动虚拟环境,然后运行

      $ rqinfo --empty-failed-queue

      更多详情请见rqinfo --help

      【讨论】:

      • 此选项不再可用。我在 RQ 0.5.5。
      【解决方案6】:

      以下是使用django_rq 清除失败作业注册表的方法:

      import django_rq
      from rq.registry import FailedJobRegistry
      
      queue = django_rq.get_queue("your_queue_with_failed_jobs")
      registry = FailedJobRegistry(queue=queue)
      
      for job_id in registry.get_job_ids():
        registry.remove(job_id)
      

      【讨论】:

        【解决方案7】:

        - 2022 -

        我也在为此苦苦挣扎,这是一段对我有用的代码。

        它遍历队列名称(在我的例子中是“默认”和“低”),获取每个队列的所有失败作业并删除它们

        import django_rq
        from rq.registry import FailedJobRegistry
        from redis import Redis
        from rq.job import Job
        from django.conf import settings
        redis = Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT)
        queues = ["default", "low"]
        for q in queues:
            queue = django_rq.get_queue(q)
            registry = FailedJobRegistry(queue=queue)
            for job_id in registry.get_job_ids():
                job = Job.fetch(job_id, connection=redis)
                registry.remove(job)
        

        【讨论】:

          【解决方案8】:

          默认情况下,“rq”作业以“rq:job”为前缀。因此,您可以使用以下命令从 redis 中删除这些作业,

          redis-cli KEYS rq:job:* | xargs redis-cli DEL
          

          【讨论】:

            猜你喜欢
            • 2017-03-28
            • 2013-08-08
            • 2018-06-14
            • 2012-06-30
            • 2010-12-06
            • 1970-01-01
            • 2015-01-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多