Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按名称从芹菜队列中删除任务_Python_Redis_Celery - Fatal编程技术网

Python 如何按名称从芹菜队列中删除任务

Python 如何按名称从芹菜队列中删除任务,python,redis,celery,Python,Redis,Celery,我正在试图找到一种方法,从芹菜队列中删除当前队列中具有特定给定名称的所有任务。从官方文件中,我知道我可以检查工人,通过查找他们的姓名,然后获取他们的身份证来撤销任务,如: def drop_celery_task(options): def _get_tasks_id(workers: list, tasks_ids: list, task_name: str): """ Get task ids with the given

我正在试图找到一种方法,从芹菜队列中删除当前队列中具有特定给定名称的所有任务。从官方文件中,我知道我可以检查工人,通过查找他们的姓名,然后获取他们的身份证来撤销任务,如:

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}")

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

我最终用我在Redis中想要的名称标识了任务的id(使用Redis客户端,而不是芹菜命令),然后通过
控件(app=cellery\u app).revoke(task\u id)
commnad。在Redis中,队列是带有队列名称的键下的列表对象