42.django-celery-beat, Django 与 Celery 集成:定时任务

132 阅读1分钟

image.png

任务心跳管理进程

  • Beat

任务调度器

  • PersistentScheduler (默认)
  • DatabaseScheduler

任务存储

  • File Configuration
  • Database

工作流

  • Beat 调用 Task Scheduler 获取任务信息
  • 检查任务状态
    • 到了执行时间 就去执行
  • 保存 任务的执行结果

安装

安装 beat

python3 -m pip install django-celery-beat

数据库变更

注册应用 修改settings添加配置

INSTALLED_APPS = [
    'django_celery_beat'
]
python3 manage.py makemigrations
python3 manage.py migrate

image.png

使用 DatabaseScheduler 启动 beat 或者在 配置中设置 beat_scheduler

使用 DatabaseScheduler

DJANGO_SETTINGS_MODULE=settings.develop celery -A wangdalei beat --scheduler django_celery_beat.schedulers:DatabaseScheduler

--scheduler django_celery_beat.schedulers:DatabaseScheduler 使用数据库进行存储数据 数据会存储到 django_celery_beat中

image.png

admin后台可以看到数据库模型 image.png

管理定时任务的方法

  • 在 Admin 后台添加管理定时任务
  • 系统启动时自动注册定时任务
  • 直接设置应用的 beat_schedule
  • 运行时添加定时任务

方式一 在 Admin 后台添加管理定时任务

image.png

方法二 系统启动时自动注册定时任务

wangdalei_dj/wangdalei/celery.py


from celery.schedules import crontab

@app.task
def test(arg):
    print(arg)

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='hello every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

主应用中做了配置 当主应用被调用时 会连带的启动celery应用 wangdalei_dj/wangdalei/init.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

方法三 直接设置应用的 beat_schedule