Celery任务串行执行,如何调整配置实现并行或队列预收全量任务
你当前Celery串行执行任务的根本原因是启动参数指定了--pool=solo,solo是单进程执行池,无论并发数设置为多少,同一时间仅能运行1个任务,执行完成后才会拉取下一个任务。以下是两个需求的对应调整方案:
需求1:实现多任务并行执行
调整逻辑
去掉solo池配置,更换为支持并发的执行池即可。注意Windows环境下Celery 4.x及以上版本不支持prefork多进程池,推荐使用gevent协程池,适配IO密集/CPU密集型任务。
操作步骤
- (使用gevent池时需先执行)安装gevent依赖:
pip install gevent
- 修改启动命令,去掉
--pool=solo,指定并发池和并发数:
celery -A rana worker --loglevel=INFO --without-gossip --without-mingle --without-heartbeat -Ofair --pool=gevent --concurrency=8
配置后worker最多可同时并行执行8个任务,10个无依赖任务会分两批执行完成。
需求2:队列先接收全部10个任务再按顺序逐个执行
调整逻辑
需要满足两个条件:
- 先批量将10个任务全部推送到RabbitMQ队列中,不要发送一个就等执行完成再发下一个
- 保留单进程串行执行模式,同时设置预取数为1,保证严格按队列FIFO顺序执行,不会出现worker提前缓存任务的情况
操作步骤
修改启动命令,保留--pool=solo,新增--prefetch-multiplier=1参数:
celery -A rana worker --loglevel=INFO --without-gossip --without-mingle --without-heartbeat -Ofair --pool=solo --prefetch-multiplier=1
配置后worker每次仅从队列拉取1个任务,执行完成后才会拉取下一个,只要提前将10个任务全部推送到队列,就会按照任务入队顺序逐个执行。
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

