Celery如何通过parent_id获取父任务的请求信息与执行结果
Celery 子任务内查询父任务信息的实现方法
你需要提前为Celery实例配置result_backend(如Redis、MySQL等),否则无法存储和查询历史任务的状态、结果与元数据。
核心实现步骤
在pdb断点交互界面直接执行以下代码即可:
# 1. 获取当前任务的父任务ID parent_id = app.current_task.request.parent_id # 2. 实例化父任务的异步结果查询对象 parent_task = app.AsyncResult(parent_id) # 3. 查询父任务运行状态 print(parent_task.state) # 4. 查询父任务执行结果(仅任务执行完成后可返回有效值) print(parent_task.result)
查询父任务request上下文的额外配置
默认Celery不会将任务的request上下文存储到结果后端,需要提前添加如下配置:
app = Celery( 'hello', broker='你的broker连接地址', result_backend='你的结果后端连接地址', # 开启任务启动状态追踪 task_track_started=True, # 开启扩展结果存储,支持保存任务请求元数据(Celery 5.2及以上版本支持) result_extended=True )
配置完成后,就可以通过以下方式获取父任务的request信息:
print(parent_task.info) # request相关的上下文字段都会存储在info字典中
如果你使用的Celery版本不支持result_extended参数,可以在父任务的返回值中主动嵌入request信息:
@app.task def your_parent_task(): # 父任务的业务逻辑 business_result = "父任务返回结果" # 返回时携带request上下文 return { "result": business_result, "request_info": app.current_task.request.__dict__ }
之后在子任务中直接读取parent_task.result.get("request_info")即可拿到父任务的request信息。
注意事项
- 若父任务还处于待执行、执行中状态,
parent_task.result会返回空值或Pending标记,需等待父任务执行完成后才能拿到有效结果 - 可根据业务需求配置
result_expires参数设置任务结果的过期时间,避免结果后端存储资源被占满
内容的提问来源于stack exchange,提问作者user3225309
相关产品推荐
相关产品推荐

