【发布时间】:2018-12-21 20:59:34
【问题描述】:
我遇到了以下警告:
后端使用资源来存储和传输结果。为确保资源被释放,您最终必须在调用任务后返回的每个 AsyncResult 实例上调用 get() 或 forget()。
我目前正在使用django-db backend,我想知道不注意此警告的后果。如果我不forget 和AsyncResult,哪些资源不会被“释放”?我不担心从我的数据库中清理任务结果。我主要关心的是工人的可用性受到影响。
【问题讨论】:
我遇到了以下警告:
后端使用资源来存储和传输结果。为确保资源被释放,您最终必须在调用任务后返回的每个 AsyncResult 实例上调用 get() 或 forget()。
我目前正在使用django-db backend,我想知道不注意此警告的后果。如果我不forget 和AsyncResult,哪些资源不会被“释放”?我不担心从我的数据库中清理任务结果。我主要关心的是工人的可用性受到影响。
【问题讨论】:
我实际上从未见过那个警告。只要你运行 celery beat,你会没事的。 Celery 有一个默认的定期任务,它会为您设置并计划在凌晨 4:00 运行。如果您使用基于数据库的后端(如 postgres 或 mysql),该任务会删除数据库中所有过期的结果。
【讨论】:
Celery 似乎对此有一个设置,即result_expires。文档说明了一切:
result_expires默认:1 天后过期。
存储的任务墓碑将被删除的时间(以秒为单位,或 timedelta 对象)。
但正如@2ps 所提到的,celery-beat 必须运行用于数据库后端,据记录表明“任务每天凌晨 4 点运行”。对于其他类型的后端,例如AMQP,似乎没有必要记录:
注意
目前这只适用于 AMQP、数据库、缓存、Couchbase 和 Redis 后端。
使用数据库后端时,必须运行 celery beat 才能使结果过期。
【讨论】: