You need to enable JavaScript to run this app. Celery 如何获取group内各任务独立状态?为何result.children始终为None
优惠活动
大模型
产品
解决方案
定价
更多

Celery 如何获取group内各任务独立状态?为何result.children始终为None

问题核心原因

你当前实现拿不到子任务状态,本质是三个操作错位导致的:

  • 调用参数错位:group.apply_async() 方法本身不支持通过task_id参数自定义顶层group任务的ID,传入的这个参数会被Celery直接忽略,你自定义的my_id根本不会和实际生成的GroupResult绑定。原代码里job.apply_async(task_id=my_id))还存在多写一个右括号的语法错误,实际执行时会直接抛语法异常。
  • 结果类型错配:group类的组合任务返回的是GroupResult类型,不是普通单任务的AsyncResult。AsyncResult本身没有存储子任务列表的逻辑,自然不会有children属性,你手动用AsyncResult(id=my_id)查询时,因为传入的ID根本不存在对应任务记录,查询结果永远是PENDING,children字段恒为None。
  • 没有正确接收返回值:group.apply_async()的返回值已经是包含全量子任务元信息的GroupResult实例,不需要自己手动拿ID重新构造结果对象。
可正常运行的实现方案
  • 第一步:构造group任务后直接调用apply_async,不要强行传自定义task_id,接收返回的GroupResult实例:
    job = group([my_task.s(item) for item in items])
    group_result = job.apply_async()
    
  • 第二步:如果需要跨流程持久化查询group状态,直接使用GroupResult自带的id属性作为标识,不要自己硬编码ID:
    group_id = group_result.id
    
  • 第三步:后续查询状态时,必须用GroupResult类初始化对应实例,才能拿到子任务列表:
    from celery.result import GroupResult
    result = GroupResult(id=group_id)
    # 此时可以正常读取group整体状态,以及每个子任务的独立执行状态
    assert 0, (result.state, result.children)
    
补充说明

拿到children列表后,每个元素都是对应子任务的AsyncResult实例,可单独读取每个任务的执行状态、返回值、错误信息,不需要重新查询。

如果需要给group任务自定义顶层ID,可以在初始化GroupResult时手动绑定,而不是在apply_async调用时传参——Celery的apply_async方法只支持单任务的自定义task_id传参,组合类任务的ID自定义是通过GroupResult的初始化逻辑实现的,传参方式不对会导致整个ID绑定流程失效。

内容的提问来源于stack exchange,提问作者guettli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 13:06:04