对应版本:
Django==4.1.5
celery==5.3.5
redis==5.0.1
django-celery-beat==2.5.0
django-celery-results==2.5.1
flower==2.0.1
windows需要单独安装: eventlet==0.33.3
安装完成之后,settings文件中的INSTALLED_APPS中增加配置:
[
....,
'django_crontab',
'celery',
'django_celery_results',
'django_celery_beat',
]
继续增加celery和 celery_beat配置:
# 1、celery 配置
# BACKEND配置,可以选用redis或存放数据库
# CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'django-db' # 存放至数据库
# Broker配置,使用Redis作为消息中间件
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_CACHE_BACKEND = 'default' # 设置缓存为默认缓存,
CELERY_TASK_TRACK_STARTED = True # 设置任务启动追踪
CELERY_TASK_TIME_LIMIT = 30 * 60 # 设置任务运行时间限制为30分钟
# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'
# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# # 指定导入的任务模块,可以指定多个
CELERY_IMPORTS = (
'application.tasks',
)
# celeryUtils 的启动工作数量设置
CELERY_WORKER_CONCURRENCY = 20
# 任务预取功能,就是每个工作的进程/线程在获取任务的时候,会尽量多拿 n 个,以保证获取的通讯成本可以压缩。
WORKER_PREFETCH_MULTIPLIER = 20
# 非常重要,有些情况下可以防止死锁
CELERYD_FORCE_EXECV = True
# celeryUtils 的 worker 执行多少个任务后进行重启操作
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100
# 禁用所有速度限制,如果网络资源有限,不建议开足马力。
WORKER_DISABLE_RATE_LIMITS = True
# 明确指示在启动时进行连接重试
# BROKER_CONNECTION_RETRY_ON_STARTUP = True
BROKER_CONNECTION_RETRY_ON_STARTUP = True
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
# 2、celery_beat 配置
CELERY_TIMEZONE = 'Asia/Shanghai' # celeryUtils 时区问题
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
# 为存储结果设置过期日期,默认1天过期。如果beat开启,Celery每天会自动清除。
# 设为0,存储结果永不过期
# CELERY_RESULT_EXPIRES = xx
CELERY_TASK_RESULT_EXPIRES = 60*60*24 # 后端存储的任务超过一天时,自动删除数据库中的任务数据,单位秒
CELERY_MAX_TASKS_PER_CHILD = 1000 # 每个worker执行1000次任务后,自动重启worker,防止任务占用太多内存导致内存泄漏
配置文件当前目录下新增celery.py文件:
import os
from django.utils import timezone
import django
from django.conf import settings
from celery import platforms
from celery import Celery
from celery.schedules import crontab
from datetime import timedelta
# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
# app = Celery(f"application", broker=settings.BROKER_URL, backend=settings.RESULT_BACKEND)
celery_app = Celery(f"application")
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
# celery_app.config_from_object(settings, namespace='CELERY')
# app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
celery_app.autodiscover_tasks()
# platforms.C_FORCE_ROOT = True
# 解决时区问题,定时任务启动就循环输出
celery_app.now = timezone.now
@celery_app.task(bind=True)
def test_auto_discover():
print("This task is registering successfully")
setting文件当前目录下的__init__.py文件下新增如下代码:
from .celery import celery_app
# from celery import celery_app as celery_app
__all__ = ("celery_app")
注意,这里是导入当前celery文件的app,不是celery包里面的,不然会导致admin那边发现不了已注册的任务
然后就可以在你应用下新增tasks.py 文件,就可以被自动发现, 内容大概如下:
from celery import shared_task
@shared_task
def wodewodewode():
print("testcrontab:*************")
启动celery:
celery -A application worker -B --loglevel=info
也可以拆分成两个命令启动:
celery -A application worker --loglevel=info
celery -A application beat --loglevel=info
至此,所有配置完成。