美文网首页
Celery 在Django中的定时任务

Celery 在Django中的定时任务

作者: AllenBigBear | 来源:发表于2019-07-14 22:02 被阅读0次

    上一篇记录的是异步任务,这一篇做一个定时任务的练习

    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

    相关文章

      网友评论

          本文标题:Celery 在Django中的定时任务

          本文链接:https://www.haomeiwen.com/subject/ycgikctx.html