【问题标题】:Clearing out redis from celery tasks that has finished从已完成的 celery 任务中清除 redis
【发布时间】:2020-11-14 19:11:38
【问题描述】:

我正在使用 celery 任务队列,它使用 Redis 作为消息代理来运行一些将结果保存到 Redis 的后台任务。

我想从确实完成的任务结果中清除 Redis,因为我不再需要它们,所以如果出现大幅峰值,我不应该担心。

我遇到了CELERY_RESULT_EXPIRES,它表示任务结果将在 X 秒后自动清理。

考虑以下代码:

from celery import Celery

CONFIG = {
    'BROKER_URL': 'redis://localhost:6379/0',
    'CELERY_RESULT_BACKEND': 'redis://localhost:6379/0',
    'CELERY_RESULT_EXPIRES': 15, # 15 secs
    'BROKER_POOL_LIMIT': 0, # redis connection get closed once task is done..
}


celery = Celery('tasks', config_source=CONFIG)

@celery.task(name='tasks.say_hello')
def say_hello():
    return "Helloooooo i just came out from the background!"


if __name__ == '__main__':
    say_hello.delay().get()

当运行上面的代码并同时运行celery beat -A tasks -l info,然后在一段时间后(超过 5 分钟)检查 Redis,我看到了:

127.0.0.1:6379> KEYS *
1) "_kombu.binding.celery"
2) "_kombu.binding.celery.pidbox"
3) "_kombu.binding.celeryev"
4) "celery-task-meta-854543d8-14ad-4bf8-9725-edcf64131bb2"
5) "celery-task-meta-fa3e267e-46d0-4488-a766-d3276b6abdeb"
6) "celery-task-meta-86c2d83c-cadd-41b9-b4ff-426607786299"

已完成的任务 4 到 6 还在那里!结果不是应该在 15 秒后清除吗,我在这里遗漏了什么吗?

提前致谢。

【问题讨论】:

  • 你用的是哪个版本的芹菜?
  • @2ps 4.4.6(悬崖)

标签: python django redis celery


【解决方案1】:

@zhong 所以你缺少的是 docs 中所述的 celery.backend_cleanup

“内置定时任务将在此时间后删除结果”,所以内置任务默认每天凌晨4点运行,所以如果不更改配置肯定会被删除,你可以跨检查凌晨 4 点之后,如果您打算将其存储在 db 中,则必须为此运行 celery beat,

所以回顾一下,它会被删除,是的,但只有当 celery 后端清理器运行时,你配置的那个决定了需要存储的结果的生命周期,但这并不意味着 redis 会为你删除它,那个过期团队是让 celery clean 去查看并确定,是的,这个结果现在可以删除了。

【讨论】:

  • 是的,在文档中它说 CELERY_RESULT_EXPIRES 被解释为 result_expires 但这是错误的,实际上 result_expires 回退到 CELERY_TASK_RESULT_EXPIRES ...所以使用后者确实解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2013-06-15
  • 2016-04-09
  • 2018-08-06
  • 2018-02-11
相关资源
最近更新 更多