当前位置 博文首页 > yunweigo的博客:django celery 计划任务

    yunweigo的博客:django celery 计划任务

    作者:[db:作者] 时间:2021-07-15 12:39

    设置时区
    计划任务默认是时区使用的是UTC时间, 我们需要设置为国内的时区。

    timezone = 'Asia/Shanghai'
    

    针对django项目当中可以通过设置TIME_ZONE,
    文件 proj/proj/settings

    LANGUAGE_CODE = 'zh-hans'
    
    TIME_ZONE = 'Asia/Shanghai' 
    
    CELERY_TIMEZONE = TIME_ZONE
    ...
    

    或者单独给celery进行设置

    app.conf.timezone = 'Asia/Shanghai' # 设置时区
    

    周期性任务
    我们先执行一个简单的计划任务

    每秒执行一次

    # task.py
    from celery import Celery
    from celery.schedules import crontab
    
    CELERY_RESULT_BACKEND = 'redis://127.0.0.1/5'
    BROKER_URL = 'redis://127.0.0.1/6'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    celery_task = Celery('tasks', backend=CELERY_RESULT_BACKEND, broker=BROKER_URL)
    
    celery_task.conf.timezone = TIME_ZONE
    
    celery_task.conf.beat_schedule = {
        # 每秒执行一次
        'add-every-monday-morning': {
            'task': 'task.add',
            'schedule': 1,
            'args': (16, 16),
        },
        # 计划任务
        'add-every-one-minute': {
             'task': 'tasks.add',
             'schedule': crontab(minute=1),
             'args': (16, 16)
        },
    }
    
    @celery_task.task
    def add(x, y):
        print(x + y)
        return x + y
    

    说明:crontab 时间表达式,具体的表达式参考附录

    启动任务

    celery -A msg worker -l INFO -B
    [2021-04-10 10:11:59,745: WARNING/ForkPoolWorker-9] 32
    [2021-04-10 10:11:59,781: INFO/ForkPoolWorker-9] Task task.add[e3bb80c6-f34b-49ed-8eb4-17b0b6153fde] succeeded in 0.03555258899999103s: 32
    [2021-04-10 10:11:59,782: INFO/MainProcess] Received task: task.add[d442682d-1f5e-4717-b231-882803451e2f]  
    [2021-04-10 10:11:59,783: WARNING/ForkPoolWorker-9] 32
    [2021-04-10 10:11:59,833: INFO/MainProcess] Received task: task.add[78a30223-6c91-492b-87e9-8ffe177a2eee]  
    [2021-04-10 10:11:59,835: INFO/ForkPoolWorker-9] Task task.add[d442682d-1f5e-4717-b231-882803451e2f] succeeded in 0.0518018430000069s: 32
    [2021-04-10 10:11:59,835: WARNING/ForkPoolWorker-2] 32
    

    具体计划任务表达式可以参看附录内容。

    附录

    例子意义
    crontab()每分钟执行一次。
    crontab(minute=0, hour=0)每天00点执行
    crontab(minute=0, hour=’*/3’)每三个小时执行一次
    crontab(minute=0,hour=‘0,3,6,9,12,15,18,21’)每3个小时执行一次,单独设置小时灵活配置
    crontab(minute=’*/15’)每15分钟执行一次
    crontab(day_of_week=‘sunday’)在星期日每分钟执行一次(! 这里需要注意,任务是每分钟执行一次)
    crontab(minute=’’,hour=’’, day_of_week=‘sun’)星期天,每分钟执行一次
    crontab(minute=’*/10’,hour=‘3,17,22’, day_of_week=‘thu,fri’)在周四或周五的凌晨3-4点,下午5-6点以及晚上10-11点之间执行,每10分钟执行一次
    crontab(0, 0, day_of_month=‘2’)在每个月的第二天执行。
    crontab(0, 0,day_of_month=‘1-7,15-21’)在每月的第一和第三周执行。
    crontab(0, 0, day_of_month=‘11’,month_of_year=‘5’)每年5月11日执行。
    crontab(0, 0,month_of_year=’*/3’)在每个季度的第一个月每天执行一次。

    后记
    todo 整除计划任务完善

    2021年200篇计划  第3篇
    
    cs