如何在Celery Chord中自定义任务组task_id并提前获取其ID
解决方案
你可以提前手动生成Group的ID,再将其传入gen_rapport任务,同时在创建Group时指定该ID,无需自定义Chord类就能实现需求。具体操作如下:
- 手动生成Group唯一ID:用Celery自带的UUID工具生成ID,确保后续能准确检索Group执行结果。
- 创建Group时指定ID:通过
group的id参数直接设置提前生成的ID——注意options参数是给组内每个子任务配置参数的,无法给Group本身设置ID,这也是你之前尝试无效的原因。 - 将Group ID传入报告任务:定义
chord的body时,把Group ID作为参数传给gen_rapport,让任务执行时能直接用这个ID获取组的执行详情。
完整代码示例:
from celery.utils import uuid from celery import group, chord from celery.result import GroupResult # 提前生成唯一的Group ID group_id = uuid() # 创建带指定ID的任务组 tasks_group = group([some_task.s() for _ in range(100)], id=group_id) # 把Group ID传给gen_rapport,同时启动chord chord(tasks_group, body=gen_rapport.s(group_id)).apply_async() # 保存Group结果,支持后续检索 group_res = GroupResult(id=group_id, results=[task.id for task in tasks_group.tasks]) group_res.save() return group_id
对应的gen_rapport任务可编写为:
@app.task def gen_rapport(group_id): # 恢复Group结果,获取执行详情 group_res = GroupResult.restore(group_id) # 编写生成报告的业务逻辑...
这样gen_rapport执行时就能直接拿到Group ID,进而获取整个任务组的执行数据,完全不需要等待chord执行完成后再获取ID。
内容的提问来源于stack exchange,提问作者Piroks
相关产品推荐
相关产品推荐

