Celery:如何通过组标识符获取子任务列表?
如何通过Celery组标识符获取任务列表
是否可以仅通过组标识符获取任务列表?以下为相关代码示例:
from celery import group def f1(): task_group = group(task1, task2) return task_group().id def f2(group_id): pass # TODO: return task1.id and task2.id当前调用
GroupResult(id=f1()).children返回None。
可以实现,但需要确保Celery正确存储组的元数据,以下是具体步骤和修改后的代码:
关键前提
首先要保证你的Celery实例配置了结果后端(如Redis、数据库等),组的子任务关联信息需要存在结果后端中才能被获取。示例配置:
from celery import Celery app = Celery('your_app_name', broker='pyamqp://guest@localhost//', backend='redis://localhost:6379/0') # 配置结果后端
修改代码实现
1. 使用任务签名创建组
创建组时要使用任务签名(.s()),而不是直接传入任务函数,这样Celery才能正确记录子任务信息:
from celery import group, GroupResult from your_celery_app import app # 导入你的Celery实例 @app.task def task1(): return "Task 1 completed" @app.task def task2(): return "Task 2 completed" def f1(): # 用.s()生成任务签名 task_group = group(task1.s(), task2.s()) group_result = task_group() return group_result.id
2. 从结果后端恢复组并获取子任务ID
使用GroupResult.restore()方法加载完整的组信息,而不是直接实例化GroupResult:
def f2(group_id): # 从结果后端恢复组结果对象 group_result = GroupResult.restore(group_id, app=app) # 提取子任务ID列表 if group_result and group_result.children: task_ids = [task.id for task in group_result.children] return task_ids return []
为什么原代码返回None?
- 原代码直接实例化
GroupResult(id=f1())不会从结果后端加载数据,只是创建了一个空的对象,所以children为None。 - 直接传入任务函数而非签名,可能导致Celery未记录子任务的关联元数据。
- 未配置结果后端时,组的信息无法持久化,自然无法获取子任务列表。
额外注意事项
- 确保Celery Worker已启动并能正常连接到结果后端。
- 如果组任务尚未被调度执行,
children可能暂时为None,需等待任务被Worker处理后再尝试获取。
内容的提问来源于stack exchange,提问作者michal111
相关产品推荐
相关产品推荐

