单进程Celery Worker运行多条chain出现任务执行顺序混淆问题
现象成因说明
这个现象是Celery链式任务的默认提交逻辑导致的,核心原因是链式任务的子任务不会一次性全部投递到消息队列,而是前序任务执行完成后才会动态投递后续子任务,完整执行逻辑如下:
- 调用
chain(*tasks_to_chain1).apply_async()、chain(*tasks_to_chain2).apply_async()提交两个链式任务时,Celery只会分别把两个链的第一个子任务C1.1、C2.1投递到RabbitMQ队列,此时队列中的待执行任务顺序为[C1.1, C2.1] - 配置了
celery -A tasks worker -c 1的单worker按队列优先级先取出C1.1执行,执行完成后worker才会把C1的下一个子任务C1.2追加到队列的末尾,此时队列状态变为[C2.1, C1.2] - worker接下来取出队列头部的C2.1执行,执行完成后把C2的下一个子任务C2.2追加到队列末尾,队列状态变为
[C1.2, C2.2] - 后续流程重复上述逻辑,就会出现C1、C2的子任务交替执行的观测结果,和你看到的
C1.1→C2.1→C1.2→C2.2→C1.3→C2.3顺序完全匹配。
如果需要实现你预期的C1全链执行完成后再执行C2的效果,可以将两个chain再封装为一个上层大chain提交,或者为不同的chain配置独立的消息队列+独立worker消费。
内容的提问来源于stack exchange,提问作者Alain B.
相关产品推荐
相关产品推荐

