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 后台任务的主要内容,如果未能解决你的问题,请参考以下文章