我们使用以下命令使用Django运行Celery: python manage.py芹菜工人-Q some_queue -l INFO -n some_worker -concurrency = 1
流程就是这样 - (假设CELERYD_MAX_TASKS_PER_CHILD = 1
):
1.运行芹菜时,会产生一个主进程(大约60MB RAM)
2.子进程立即分叉(也是60MB)
3.主进程从队列中提取任务并将其交给孩子
3.子进程完成处理任务,并由主进程终止,并释放内存
4.主进程现在从队列中拉出另一个任务,它的内存增加到72MB
5.子进程从主队列(也是72MB)分叉
......依此类推。
事实上,主进程永远不会重启,只有孩子才能重启。但是它所传递的每一条消息都会增加它的内存使用量,因此一段时间后我们就会耗尽内存。
我们尝试了以下设置无效:
CELERYD_PREFETCH_MULTIPLIER = 1
CELERY_ACKS_LATE = True
CELERYD_MAX_TASKS_PER_CHILD = 1
-Ofair