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

Celery Chord中的任务是否始终按启动顺序执行?

Celery Chord任务执行顺序与结果顺序的说明

核心结论

Celery Chord的子任务是并发执行的,实际执行顺序无固定保证,但回调任务接收到的结果列表会严格保持子任务的提交顺序——这就是你多次测试返回True的根本原因。

你的测试为什么总是返回True?

你提交的子任务是add(i,i),返回值为2i,提交顺序是i=0到i=99。不管子任务实际执行顺序如何,Chord都会自动按提交顺序整理结果,最终传给回调的列表是[0,2,4,...,198],这个列表本身就是有序的,所以check_task_order里的numbers == sorted(numbers)必然为True,和你在回调里加的time.sleep(random())无关(sleep是在结果排序完成后执行的)。

如何验证子任务的实际执行顺序?

要验证子任务执行顺序不固定,需要在子任务内部记录执行时机,比如修改add任务打印日志:

# app.py 修改后的add任务
@app.task
def add(x, y):
    print(f"执行add({x}, {y}) - 当前时间: {time.time()}")
    time.sleep(random.random())  # 子任务内加随机sleep,模拟执行时长差异
    return x + y

启动worker后运行start.py,查看worker的日志,会看到add任务的执行顺序是随机的(比如先执行add(5,5),再执行add(2,2)),但回调任务收到的结果列表依然是[0,2,4,...,198]。

Chord的设计逻辑

Chord的本质是"一组子任务 + 一个回调任务",Celery会跟踪每个子任务的提交顺序,当所有子任务完成后,按提交顺序将结果汇总传给回调,这样可以保证回调能按照预期的顺序处理结果,避免因为子任务执行乱序导致的逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:31:06