我一直在阅读django-芹菜,试图找到一种原生的方式来清理celery_taskmeta,所以这个表在生产环境中不会增长太多。
找不到任何东西。我应该做一个命令来处理这个吗?
我没有使用django-芹菜,所以我的答案可能是不完整的
在后台有一个方法,允许你强制清理celery_taskmeta:在celery_backend .base。在BaseBackend中,您可以找到方法cleanup()
所以,当我需要强制清理时,我有三种方法:- 在生产者端使用AsyncResult
- 在消费者端使用任务 <
- celerybeat任务/gh>
# 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()
请注意,在任务本身中调用清理似乎非常糟糕。
with celerybeat task
第三个选项是使用celerybeat任务来清理后端celery_taskmeta。这是我可能会选择的。
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作业,有很好的文档
我有一个cronjob运行Django命令,执行以下SQL语句:
"truncate table celery_taskmeta"
在0.47ms内删除了50,000条记录