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

admin 2021年9月1日14:55:54评论95 views字数 795阅读2分39秒阅读模式

简述

在当前的项目中,由于项目需求,需要实现一个将一个大任务拆分成无数个子任务的功能。
而在这个功能实现的时候,由于拆分的子任务数量太大,导致内存占用一直攀升直至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)

FROM :rickyhao.com | rickyhao.com

相关推荐: 红队工具:编写自定义Shellcode

备注 原文名称:Red Team Tooling: Writing Custom Shellcode 原文地址:https://www.praetorian.com/blog/red-team-tooling-writing-custom-shellcode/…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月1日14:55:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Celery 任务生产者在大规模生产任务时,存在的内存累积问题https://cn-sec.com/archives/499663.html

发表评论

匿名网友 填写信息