我一直在阅读django-celery试图找到一种清理celery_taskmeta的原生方式,因此在生产环境中这张桌子不会长得太多。
什么也找不到。我应该做一个处理这个的命令吗?
答案 0 :(得分:6)
我没有使用django-celery所以我的答案可能不完整。
后端有一个方法可以强制清除celery_taskmeta:在celery.backends.base.BaseBackend中,你可以找到方法cleanup()
所以,当我需要强制清理时,我有三种方法:
# 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()
请注意,在任务本身中调用清理工作似乎很安静。
第三种选择是使用清理后端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条记录。