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

为什么Django中Celery任务无法并行执行?该如何解决?

问题根因

你遇到的任务串行问题90%以上的场景是Celery Worker的并发配置不足导致的:默认Celery启动的Worker进程数和机器CPU核心数一致,如果你启动时没有指定并发数,单核心机器默认只会启动1个工作进程,同一时间只能处理1个任务,自然会排队串行执行。

解决方案
  • 调高Worker并发数
    启动Celery Worker时通过--concurrency(可简写为-c)参数指定并发数,比如你需要同时处理10个任务,启动命令如下:
    celery -A <你的项目模块名> worker -c 10 --loglevel=info
    
    如果你的任务是IO密集型(比如包含大量数据库读写、网络请求,和你描述的单任务耗时3分钟的特征匹配),更推荐用协程并发模型,资源消耗更低、并发数可以开得更高:先安装gevent依赖pip install gevent,再用以下命令启动:
    celery -A <你的项目模块名> worker -c 20 -P gevent --loglevel=info
    
  • 排查任务限制配置
    检查你的任务装饰器或者Celery全局配置,有没有设置rate_limit(任务速率限制)参数,如果配置了低于你预期的速率限制,直接删除或者调大即可。
  • 排查资源锁竞争
    给任务的开始、执行、结束阶段加日志,确认任务是没有被Worker领取,还是领取后因为数据库锁、共享资源锁导致执行阻塞。如果是锁竞争导致的串行,需要优化数据库操作逻辑,减少锁持有时间。
  • 水平扩展Worker节点
    如果单台机器的并发上限不足以支撑你的业务量,可以在多台服务器上启动连接同一个消息中间件(RabbitMQ/Redis)的Celery Worker,所有Worker会自动从队列中抢占任务执行,实现更高的并发处理能力。
替代方案

如果不想继续使用Celery,可以选择以下方案:

  • 轻量任务队列:可以用RQ(Redis Queue)、Django Q(适配Django生态)这类更简单的任务队列组件,配置门槛更低,并发调整更灵活。
  • Serverless函数计算:云原生场景下可以直接用云厂商的Serverless函数服务,每个请求触发一个函数实例执行,平台自动实现扩缩容,无需自己维护Worker集群。
  • 进程/线程池:如果对任务可靠性要求不高(允许应用重启时丢失未执行完成的任务),可以直接用Python标准库的concurrent.futures模块在线程/进程池中执行任务,无需引入额外的队列组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:27:00