Heroku celery 后台任务

Posted

技术标签:

【中文标题】Heroku celery 后台任务【英文标题】:Heroku celery background task 【发布时间】:2013-03-19 09:27:14 【问题描述】:

我们有一个在 Heroku 上使用 django-celery 运行的简单任务。比如:

@task
Simple_task():
    for line in csv.reader(origin):
        process_line(line)

process_line(line):
    fields = parse_line(line)
    reg = Model1() # Django model
    reg.field1 = fields[0]
    reg.field2 = fields[1]
    reg.field3 = fields[2]
    reg.save()

origin 是一个 csv 文件。当文件很大(超过 50.000 行)时,任务会占用所有内存,导致 R14 错误,直到被系统取消(在 512 MB 可用内存的 150% 处)。内存永远不会释放,我们必须手动重新启动任务。

在 Linux 机器上运行或在开发机器上与工头一起运行,它可以毫无问题地完成(全部 170.000 行)。它似乎只在 Heroku 上泄漏内存。 顺便说一句,我们使用 DEBUG=False 运行。

Heroku 执行 celery 任务是否有问题?有什么我们可以缺少的吗?这已成为在 Heroku 上部署的障碍。

任何帮助将不胜感激。

【问题讨论】:

只是一个一般性的调试建议:我猜这与 Django 和 Celery 都无关。为了证明这一点,我将创建一个最小的 Heroku 应用程序(没有 Django,只是一个简单的“main”)来执行此操作,并尝试运行它。如果失败,请先查看您的 requirements.txt,然后再添加调试打印。如果成功,开始逐渐添加其余的东西,直到你弄明白为止。祝你好运! 您确定它没有在本地使用大量内存而您只是没有注意到吗? 【参考方案1】:

DEBUG is set to True 时 Django 会泄漏内存,因为它会保存已执行的每个 SQL 语句的副本。

您可以使用与您的主机具有相同规格的虚拟机进行本地测试。或者使用ulimit 来限制进程内存。这样您就可以在本地检查您的代码是否仅适用于 512MB 的 RAM。

【讨论】:

【参考方案2】:

我同意 JoshB 的观点,在你的情况下它似乎需要超过 512MB 的内存。

如果你创建任务process_line 并创建队列而不是任务来处理整个文件会怎样。在这种情况下,您在 Heroku 上的内存不会超载。

另一个可能的解决方案是 Heroku 的新服务,您可以在测功机上使用 1GB RAM。 链接: 2x dynos beta

【讨论】:

以上是关于Heroku celery 后台任务的主要内容,如果未能解决你的问题,请参考以下文章

falsk 使用celery后台执行任务

Django中使用celery完成异步/耗时/后台任务

Flask 学习-58.基于 Celery 的后台任务

Celery / Heroku - 使用 Heroku run python 在后台运行时,延迟()啥也不做

Heroku:使用 RQ 的 Python 后台任务

利用django admin后台配置celery定时任务