【问题标题】:How to remove a task by name from a Celery Queue如何从 Celery 队列中按名称删除任务
【发布时间】:2020-12-16 17:53:28
【问题描述】:

我正在尝试找到一种方法来从 Celery 队列中删除所有当前排队的具有特定给定名称的任务。从官方文档中,我知道我可以检查工人并通过查找他们的姓名然后获取他们的 ID 来撤销任务,例如:

def drop_celery_task(options):
    def _get_tasks_id(workers: list, tasks_ids: list, task_name: str):
        """
        Get task ids with the given name included inside the given `workers` tasks.
        {'worker1.example.com': [
             {'name': 'tasks.sleeptask', 'id': '32666e9b-809c-41fa-8e93-5ae0c80afbbf',
              'args': '(8,)', 'kwargs': '{}'}]
        }
        """

        for worker in workers:
            if not workers[worker]:
                continue
            for _task in workers[worker]:
                if _task["name"].split(".")[-1] == task_name:
                    tasks_ids.append(_task["id"])

    task_name = options.drop_celery_task["name"]
    i = Inspect(app=celery_app)  # Inspect all nodes.
    registered = i.registered()
    if not registered:
        raise Exception("No registered tasks found")

    if not any(task_name == worker.split(".")[-1] for worker in chain(*list(registered.values()))):
        raise Exception(f"Task not registered: {task_name}")

    tasks_ids = []
    _get_tasks_id(i.active(), tasks_ids, task_name)
    _get_tasks_id(i.scheduled(), tasks_ids, task_name)
    _get_tasks_id(i.reserved(), tasks_ids, task_name)

    if tasks_ids:
        for task_id in tasks_ids:
            Control(app=celery_app).revoke(task_id)
    else:
        logging.info(f"No active/scheduled/registered task found with the name {task_name}")

但是这段代码只撤销了 celery worker 获取或预取的任务,而不是仍在队列中的任务(使用 Redis 作为后端)。有关如何使用 celery 命令删除 Redis 中的那些,或阻止工作人员接受具有给定名称的任务的任何建议?

【问题讨论】:

    标签: python redis celery


    【解决方案1】:

    我最终在 Redis 中用我想要的名称识别任务的 ID(使用 redis 客户端,而不是 celery 命令),然后通过Control(app=celery_app).revoke(task_id) 命令撤销这些 ID。在 Redis 中,队列是具有队列名称的键下的列表对象。

    【讨论】:

      猜你喜欢
      • 2013-11-20
      • 2021-06-02
      • 2019-05-30
      • 1970-01-01
      • 2020-05-12
      • 2013-03-12
      • 2013-10-14
      • 2015-06-16
      • 1970-01-01
      相关资源
      最近更新 更多