Ricky Hao

Celery 任务生产者在大规模生产任务时,存在的内存累积问题

简述

在当前的项目中,由于项目需求,需要实现一个将一个大任务拆分成无数个子任务的功能。
而在这个功能实现的时候,由于拆分的子任务数量太大,导致内存占用一直攀升直至Out of Memory
为了解决这个问题,我曾经怀疑过由RabbitMQ的HeartBeat带来的内存泄露问题,但是在经过了tracemalloc内存分析之后,发觉这个问题的原因其实是Celery默认开启的一个小功能(坑)。

产生原因

Celery文档中,有一个参数Task.apply_async.add_to_parent,这个参数的主要作用是:
* add_to_parent (bool) – If set to True (default) and the task is applied while executing another task, then the result will be appended to the parent tasks request.children attribute. Trailing can also be disabled by default using the trail attribute

即,默认情况下,一个主任务在运行时产生的子任务会自动被添加到主任务children列表里,并且会跟踪其运行状态。
但是在当前的需求中,我们不需要对子任务的状态进行跟踪,所以只要将add_to_parent这个参数改为False即可。

task.apply_async(add_to_parent=False)
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据