参考https://www.aiuai.cn/aifarm2045.html
启动Celery的Worker时,会生成子进程(或线程)执行池用来处理任务。使用 --pool 命令行参数选择进程或线程。
1、Solo
Solo 池是一个內联池(inline pool),意味着,任务不会同时处理,其只是创建一个线程(thread) 并使用该线程执行任务。
Solo适用需要逐一执行(one by one)的任务。不过,实际中不使用并发而仅使用 solo pool 的场景不多。
- 使用方式如:
1
celery -A tasks worker --pool=solo --loglevel=info
2、Prefork
prefork池是 Celery 对 Python 标准库 multiprocess 的改造,其能够同时处理多个任务。也是默认执行池。
多进程的方式去实现并发,默认的并发数为当前计算机的 CPU 数,可以通过设置 -c 进行自定义设置并发数。没有推荐的并发数,因为最佳的并发数取决于很多因素,如果任务主要是 I/O 限制,可以进行增加并发数,经过测试,设置超过两倍的 CPU 数量效果不是很好,很有可能会降低性能;
- 使用方式如:
1
celery -A tasks worker --pool=prefork -c 4 --loglevel=info
- 适用场景如:
- CPU密集型(CPU-bound),即,任务的大部分时间主要是 CPU 计算;只有 CPU 越快时才会速度更快.
- CPU密集型任务如:文件转换、压缩、搜索算法等.