7

我一直在阅读 django-celery 试图找到一种清理 celery_taskmeta 的本地方法,因此该表在生产环境中不会增长太多。

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

4

2 回答 2

6

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

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

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

  1. 在生产者端使用 AsyncResult
  2. 在消费者端使用任务
  3. 芹菜节拍任务

在生产者方面

# 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 作业一样有据可查

于 2013-03-20T07:36:43.613 回答
3

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

"truncate table celery_taskmeta"

在 0.47 毫秒内删除了 50.000 条记录。

于 2013-09-30T20:39:27.980 回答