【发布时间】:2019-07-18 23:38:10
【问题描述】:
问题是一个非常严重的内存泄漏,直到服务器崩溃(或者您可以通过杀死 celery 工作者服务来恢复,这会释放所有使用的 RAM)
似乎有一堆关于这件事的错误报告,但很少有人注意这个警告,在 celery API 文档中,here
警告: 后端使用资源来存储和传输结果。为确保资源被释放,您必须最终在调用任务后返回的EVERY AsyncResult 实例上调用 get() 或 forget()。
并且可以合理地假设泄漏与此警告有关。
但是,根据我对 celery 的理解,概念上的问题是,AsyncResult 实例是在用户会话中跨多个 Django 视图创建的:有些是在您在一个视图中启动/生成新任务时创建的,而有些您可以稍后创建手动(使用保存在用户会话中的 task_id)在另一个视图中检查这些任务的进度(状态)。
因此,AsynResult 对象最终将超出现实世界 Django 应用程序中多个视图的范围,并且您不想在任何这些视图中调用 get(),因为您不想减慢Django(或 apache2)守护进程。
在调用 get() 方法之前永远不要让 AsyncResult 对象超出范围的解决方案吗?
CELERY_RESULT_BACKEND = 'django-db' #后端是一个mysql数据库
BROKER_URL = 'pyamqp://localhost' #rabbitMQ
【问题讨论】:
标签: python django celery celery-task