【问题标题】:Heroku celery background taskHeroku celery 后台任务
【发布时间】: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,然后再添加调试打印。如果成功,开始逐渐添加其余的东西,直到你弄明白为止。祝你好运!
  • 您确定它没有在本地使用大量内存而您只是没有注意到吗?

标签: django heroku django-celery


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 2015-03-23
      • 2017-09-29
      • 1970-01-01
      • 2015-08-08
      • 2016-12-28
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多