如何清理celery_taskmeta?

问题描述 投票:7回答:2

我一直在阅读django-celery试图找到一种清理celery_taskmeta的原生方式,所以这个表在生产环境中不会长得太多。

找不到任何东西。我应该做一个处理这个的命令吗?

task celery django-celery
2个回答
3
投票

我有一个运行Django命令的cronjob执行此SQL语句:

"truncate table celery_taskmeta"

在0.47ms内删除了50.000条记录。


6
投票

我没有使用django-celery,所以我的答案可能不完整。

在后端有一个方法允许你强制清理celery_taskmeta:在celery.backends.base.BaseBackend中,你可以找到方法清理()

所以,当我需要强制清理时,我有3种方法:

  1. 在生产者方面使用AsyncResult
  2. 使用消费者方面的任务
  3. celerybeat任务

在生产者方面

# Launch a task
my_task = add_a_task() # use the Task.delay() method for example
# my_task is a celery.result.AsyncResult instance
# Retrieve backend and call cleanup
my_task.backend.cleanup()

在消费者方面

from celery import Task
from .celery_app import my_celery_app

# Class for a task
@my_celery_app.task()
class CopyTask(Task):
    # A Task instance got a backend property

    def run(self,**kwargs):
        """ Running method of the task """
        # Do something
        pass

    def force_cleanup(self):
        """ Force cleanup. """
       self.backend.cleanup()

请注意,在任务本身中调用清理工作似乎很安静。

与celerybeat任务

第三种选择是使用清理后端celery_taskmeta的celerybeat任务。这是我可能选择的那个。

celery beat基本上是一个调度程序,你可以运行你想要的任务。所以你可以有一个专门的任务,像这样:

from celery import Task
from .celery_app import my_celery_app

# Class for a task
@my_celery_app.task()
class CleanupTask(Task):
    # A Task instance got a backend property

    def run(self,**kwargs):
        """ Running method of the task """
        # Cleanup here
        self.backend.cleanup()

设置芹菜节拍,像crontab工作is well documented

© www.soinside.com 2019 - 2024. All rights reserved.