http://docs.celeryproject.org/en/latest/userguide/configuration.html参数配置都在这里,新旧配置的 key 对照表也有。
CELERYD_PREFETCH_MULTIPLIER = n
worker_prefetch_multiplier = n
这个是任务预取功能,就是每个工作的进程/线程/绿程在获取任务的时候,会尽量多拿 n 个,以保证获取的通讯成本可以压缩,在每个任务很短(明显小于 1 秒)情况下,是值得调大的,而且推荐是 2 的幂。0 表示尽可能多拿。如果 1 个都不想多拿,那么除了设置 1 外,还需要 设置 task_acks_late 为 true,如果你的任务不是幂等(可以重复调用)的话,可能会有问题。详细解释参考:
http://docs.celeryproject.org/en/latest/userguide/optimizing.htmltask_acks_late = True
worker_prefetch_multiplier = 1
CELERYD_MAX_TASKS_PER_CHILD = n
worker_max_tasks_per_child = n
这个表示每个工作的进程/线程/绿程 在执行 n 次任务后,主动销毁,之后会起一个新的。主要解决一些资源释放的问题。
CELERY_TASK_RESULT_EXPIRES = s
result_expires = s
这个表示保存任务结果的时长,这个时间会被设置到 redis 里面(假设 backend 是 redis ),如果抓取数据量大的话,是可以缩短保存的时间,节省 backend 的资源( redis 主要是内存)消耗,默认是 24 小时( 86400 ),单位是秒。
===分割线===
已经 fetch 的任务,要么等执行完毕,要么等 kill 掉。要注意 soft kill 和 hard kill 的区别,没记错的话是 TERMINAL 和 kill -9 的区别。soft kill 会执行完当前的 task,但是,prefetch 的会丢失。在 pycharm 里,我第一次 ctrl+c 是软 kill,可能会等上一会儿,第二次 ctrl+c 是硬 kill,直接停掉进程。
没有 fetch 的任务可以 purge 清理调队列中的。
根据选择的 pool 类型不同,可以有 solo (单进程) prefork (进程池) threading (线程池) gevent (协程池)和 eventlet (协程池)。4.x 好像废弃了线程池,主要的原因我猜可能和 GIL 有关。进程池比较耗内存,好处是所有工作线程资源都是隔离的,如果配置动态数量的挺好用。协程池 则对于 IO 密集型工作比较有优势。所有的并发数量默认是 cpu core 的数量,4 核就是 4,可以根据实际情况调大。