如何清理celery_taskmeta?

时间:2013-03-15 12:29:04

标签: task celery django-celery

我一直在阅读django-celery试图找到一种清理celery_taskmeta的原生方式,因此在生产环境中这张桌子不会长得太多。

什么也找不到。我应该做一个处理这个的命令吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

    # 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任务。 这是我可能选择的那个。

    芹菜节拍基本上是一个调度程序,你可以运行你想要的任务。 所以你可以有一个专门的任务,比如这个:

    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

答案 1 :(得分:3)

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

"truncate table celery_taskmeta"

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