Home / Blog / 编程语言
Tech · 编程语言 · Django · Celery

django-celery-beat定时任务配置

H by Haofly
· 2021-02-25 · updated 2022-09-06 · 221 views

安装

pip install django-celery-beat

配置

  1. settings.py中添加如下配置
INSTALLED_APPS = (
    ...,
    'django_celery_beat',
)

CELERY_BROKER_URL = 'sqla+sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')
CELERY_IMPORTS = ['schedules']	# 指定需要在哪些目录扫描定时任务,如果不添加则会出现 Received unregistered task of type 错误
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'django-db'	# 这是下面的django-celery-results保存结果使用的
  1. 使用命令python manage.py migrate创建数据库迁移,会生成这几张表:
django_celery_beat.models.PeriodicTask # 周期性任务
django_celery_beat.models.IntervalSchedule # 间隔性任务
django_celery_beat.models.CrontabSchedule # 定时任务
  1. 创建启动文件,在manage.py所在目录创建一个启动文件celery.py:
import os

from celery import Celery

from life_console import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
celery_app = Celery("项目名", broker=settings.CELERY_BROKER_URL)
celery_app.config_from_object("django.conf:settings", namespace="CELERY")
celery_app.autodiscover_tasks()

创建定时任务

一个定时任务可以是一个简单的函数,例如(得在CELERY_IMPORTS下才能在后台创建),例如

from 项目名.celery import celery_app

@celery_app.task
def my_cron_reminder():
    print(my_cron_reminder)

创建定时执行的任务:

  1. 在admin后台创建PeriodicTask,选择执行周期即可

  2. 或者手动插入至PeriodicTask:

    schedule, created = IntervalSchedule.objects.get_or_create(every=10, period=IntervalSchedule.SECONDS)
    PeriodicTask.objects.create(interval=schedule, name='Custom task', task='schedules.my_corn_minder')
    PeriodicTask.objects.create(interval=schedule, name='Custom task', task='schedules.my_corn_minder', args=json.dumps(['arg1', 'arg2']), kwargs=json.dumps({'abc': 12}))	# 提供参数

启动任务

需要使用下面的命令来启动worker,这样可以动态更改项目执行计划后自动生效

./venv/bin/celery -A 项目名 worker --beat --scheduler django -l debug --logfile=/var/log/celery.log --detach
# -c 1: 设置并发数量,默认是CPU的数量*2,这里设置为1其实也有两个

使用Django-Celery-Result保存定时任务执行结果

安装: pip install django-celery-resutls && python manage.py migrate,这会生成一张taskresult表,上面定时任务的结果会自动保存在表中

Haofly · 豪翔天下 · 2021-02-25

评论 · Comments

评论由 Giscus 提供,需用 GitHub 账号登录;留言会同步到这个仓库的 Discussions 里。