Celery 在Django中的定时任务
上一篇记录的是异步任务,这一篇做一个定时任务的练习
1:配置
在异步任务中,我们只用到了worker,而在定时任务中,就还要要用到celery里面的beat调度器了
首先我们来看下如何配置这个定时任务,或者说如何配置这个调度器
还是在celery.py里面进行配置
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NBAsite.settings')
app = Celery('NBAsite',broker = 'redis://localhost:6379/0',backend='redis://localhost')
app.config_from_object('django.conf:settings',namespace='CELERY')
#下面的设置就是关于调度器beat的设置
app.conf.beat_schedule ={
'autosc':{ #取个名字
'task':'stats.tasks.auto_sc', #设置是要将哪个任务进行定时
'schedule':crontab(hour=20,minute=47), #调用crontab进行具体时间的定义
},
}
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
2:具体任务页面tasks
增加一个对应要做定时任务的task
@shared_task
def auto_sc():
print ('sc test?')
return 'halo'
3:运行命令和结果
命令的话可以将激活worker和激活beat合并在一起,如下
celery -A NBAsite worker -B -l info
3:踩过的坑
别看上面就写了不多的篇幅,但是看文档和测试整整弄了一天,踩了好几个坑,虽然都是小地方没有设置对。
坑(1):一开始以为只需要运行beat命令,不需要运行worker,结果运行完以后任务死活不执行,再看了别人的例子,发现运行了beat以后,只是启动了调度器,并没有worker来执行
坑(2):还是运行的命令,千万记得加上info,不然即使任务触发了,在worker的记录页面,你是看不到任务执行结果的(比如我的例子中的print和return)
坑(3)配置中所有关于Celery的设置,还记得上面celery.py里面关于设置settings里面有一个namespace变量么?官方文档的说明是,任何与celery有关系的变量,都必须设置为CELERY开头(其实不一定要CELERY开头,你可以自定义设置)
但是我为什么会踩坑是因为,我以为namespace设置了以后,celery在读取设置时,自动为每个变量值加上CELERY前缀,但是,他实际上的意思是,让你手动在settings里为每个和celery有关系的变量都加上CELERY开头
坑(4)TIMEZONE的设置,上面和设置里面有关系的namespace设置好了,我还是踩了个坑,时间设置完以后,还是触发不了任务,后来看了下文档,其实除了你讲TIMEZONE设置完以后,还要设置ENABLE_UTC,具体设置如下
CELERY_TIME_ZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True
参考资料:
http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html?highlight=crontab