typora-root-url: ./
django+django_celery_beat动态定时任务
一、创建django项目
二、下载celery相关依赖包
celery
django_celery_beat
django-redis
django_celery_results
eventlet
三、配置django_celery_beat
1、settings配置
INSTALLED_APPS = [
......
'django_celery_beat',# pip install django-celery-beat
'django_celery_results',# 查看 celery 执行结果
.....
]
2、迁移到数据库
python manage.py magemigrations
python manage.py migrate
迁移完成可以看到:
3、celery配置
在settings.py 同一级目录下创建:celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from django.conf import settings
# 设置Django项目的默认设置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xidida_comprehensive.settings')
app = Celery(f'xidida_comprehensive')
# 使用Django的设置模块配置Celery
# app.config_from_object('django.conf:settings', namespace='CELERY')
# 使用配置
app.config_from_object('django.conf:settings')
# 自动发现任务模块
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True
在settings.py中增加配置
''' 数据库配置 '''
DATABASE_TYPE= "MySQL"
DATABASES_ENGINE = "django.db.backends.mysql"
DATABASES_NAME = "xidida_comprehensive" # 数据库名称
DATABASES_PORT = 3306 # 端口
DATABASES_USER = "root" # 数据库用户名
DATABASES_PASSWORD = "123456"# 数据库密码
DATABASES_HOST = "127.0.0.1" # 数据库端口
''' redis 配置 '''
REDIS_HOST = '127.0.0.1'
REDIS_PASSWORD = '123456' # 密码
REDIS_DB = 1
# celery 定时任务redis 库号
REDIS_PORT = 6380 # 端口
CELERY_DB = 2 # celery 库编号
# 数据库配置
if DATABASE_TYPE=="MySQL":
DATABASES = {
'default': {
'ENGINE': DATABASES_ENGINE,
'NAME': DATABASES_NAME,
'USER': DATABASES_USER,
'PASSWORD': DATABASES_PASSWORD,
'PORT': DATABASES_PORT,
'HOST': DATABASES_HOST,
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# redis 缓存
REDIS_URL = f'redis://:{
REDIS_PASSWORD if REDIS_PASSWORD else ""}@{
os.getenv("REDIS_HOST") or REDIS_HOST}:{
REDIS_PORT}/{
REDIS_DB}'
# 是否启用redis
if locals().get("REDIS_ENABLE", True):
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": REDIS_URL,
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
# celery 配置
BROKER_URL = f'redis://:{
REDIS_PASSWORD if REDIS_PASSWORD else ""}@{
os.getenv("REDIS_HOST") or REDIS_HOST}:' \
f'{
REDIS_PORT}/{
locals().get("CELERY_DB", 2)}' # Broker使用Redis
CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' # Backend数据库
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_TIMEZONE = 'Asia/Shanghai' # celery 时区问题
4、创建app
python manage.py startapp task_app
在APP下创建 tasks.py 文件
# -*- coding: utf-8 -*-
'''
@date:2023/6/26 13:45
@email:[email protected]
@author:小纯
@Content:
'''
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add():
print("定时任务add执行")
return 0
@shared_task
def mul():
print("定时任务 mul 执行")
return 0
5、创建超级用户,进行配置定时任务
5.1 配置超级用户
python manage.py createsuperuser
访问:http://127.0.0.1:8000/admin/
登陆后进入:
5.2、设置时间间隔
可以设也可以不设置,到5.3中进行其他设置即可
5.3设置任务
最后保存即可;
注意:在这里设置Schedule
6、启动
beat是一个定时任务调度器,它会定期向消息队列发送任务。
worker是Celery的消费者,它会从消息队列中获取任务并执行。
beat的作用是周期性地向消息队列发送任务,而worker的作用是接收这些任务并执行它们。
6.1 启动beat
# xidida_comprehensive 项目名
celery -A xidida_comprehensive beat -l info
6.2 启动 work
# xidida_comprehensive 项目名
启动worker
# Linux下测试,启动Celery
Celery -A xidida_comprehensive worker -l info
# Windows下测试,启动Celery
Celery -A xidida_comprehensive worker -l info -P eventlet
# 如果Windows下Celery不工作,输入如下命令
Celery -A xidida_comprehensive worker -l info --pool=solo