You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:00:19