如何获取Celery队列中未分配给Worker的任务列表?
如何获取Celery队列中未分配给Worker的任务列表?
嘿,这个问题我之前也帮人捋过——当你禁用了Celery的预取功能后,i.inspect()确实只能查到Worker正在处理的那1个任务,毕竟没有预存的任务躺在Worker手里。那些还在队列里等着被分配的任务,其实都存在你的消息中间件(也就是Broker,比如Redis或者RabbitMQ)里,所以得从Broker这边入手来查询。
下面分几种场景给你具体的解决办法:
方法1:通过Broker直接查看(最准确)
因为未分配的任务都存在Broker的队列中,直接操作Broker是最直接的方式:
如果你的Broker是Redis
Celery默认会把任务存在名为celery的Redis列表里(如果用了自定义队列,就换成你自己的队列名):
- 打开Redis命令行客户端:
redis-cli - 执行命令列出队列里所有未分配的任务:
LRANGE celery 0 -1- 这条命令会返回队列里的所有任务数据(是序列化后的格式,你可以用Celery的序列化工具反解析)
- 如果你只想看任务数量,执行:
LLEN celery
你也可以通过Celery的API来封装这个操作,比如:
from celery import Celery import json # 初始化你的Celery app app = Celery('your_task_app', broker='redis://localhost:6379/0') def get_unassigned_tasks(queue_name='celery'): # 连接到Redis redis_conn = app.connection().client # 获取队列里的所有任务 raw_tasks = redis_conn.lrange(queue_name, 0, -1) # 反序列化任务(假设用的是json序列化,根据你的配置调整) tasks = [json.loads(task) for task in raw_tasks] return tasks # 调用示例 unassigned_tasks = get_unassigned_tasks() print(f"队列里有{len(unassigned_tasks)}个未分配任务:") for task in unassigned_tasks: print(f"任务ID: {task['headers']['id']}, 任务名称: {task['headers']['task']}")
如果你的Broker是RabbitMQ
- 查看队列的任务数量:用
rabbitmqctl命令执行rabbitmqctl list_queues name messages,其中messages列就是该队列未分配的任务数 - 查看具体任务内容:推荐用RabbitMQ的管理UI(默认访问地址是
http://localhost:15672),登录后找到对应的队列,点击"Get Messages"按钮,就能预览或取出队列里的任务(注意:取出任务会从队列中移除,生产环境谨慎操作)
方法2:用Celery工具做补充验证
虽然inspect查不到未分配的任务,但可以用它来排除已处理/正在处理的任务:
celery inspect active:查看Worker当前正在处理的任务(就是你说的那1个)celery inspect reserved:查看Worker已经预取但还未开始处理的任务(因为你禁用了预取,这个列表应该是空的)celery inspect scheduled:查看已经调度但还没到执行时间的延迟任务
额外推荐:用Flower监控
如果需要长期监控队列状态,强烈推荐用Celery的官方监控工具Flower。它可以直观展示所有队列的任务数、Worker状态、任务详情,甚至能手动管理任务,非常方便。启动命令很简单:celery -A your_app flower,然后访问http://localhost:5555就能看到仪表盘。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

