Django + celery + django-celery-result + django-celery-beat 实现定时任务

1.库版本
celery 5.3.4
Django 4.2.6
django-celery-beat 2.5.0
django-celery-results 2.5.1
django-timezone-field 6.0.1
eventlet 0.33.3
flower 2.0.1
redis 3.5.3
项目名称: new_project

2.settings.py 配置(时区有关系)

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True

# django-celery  配置的部分
# Broker配置,使用Redis作为消息中间件
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'

# BACKEND配置,可以选用redis或存放数据库
# CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
CELERY_RESULT_BACKEND = 'django-db'  # 存放至数据库

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_TIMEZONE = 'Asia/Shanghai'

# # 指定导入的任务模块,可以指定多个
CELERY_IMPORTS = (
   'new_project.tasks',
)

# django-celery-beat配置
# SCHEDULER 定时任务保存数据库
# 将任务调度器设为DatabaseScheduler
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,防止任务占用太多内存导致内存泄漏
DJANGO_CELERY_BEAT_TZ_AWARE = False

  3.celery.py(与settings.py同目录)

import os
from datetime import timedelta

import django
from celery import Celery

# 设置系统环境变量,安装django,必须设置,否则在启动celery时会报错
# djangoProject1.settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new_project.settings')
django.setup()

celery_app = Celery('new_project')
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
# 发现每个app下的task.py
celery_app.autodiscover_tasks()

# 手动设置定时执行任务(也可参考后面通过admin后台设置任务)
CELERY_BEAT_SCHEDULE = {
    "add-every-30s": {
        "task": "new_project.tasks.show_msg",
        'schedule': timedelta(seconds=20),
        # 'args': (3,)  # 传递参数-
    },
}

  4.配置定时任务task.py(与settings.py文件同目录)

import random
from pdf2docx import Converter
from celery import shared_task

@shared_task
def show_msg():
    print("================================")
    return 111
该任务可在admin/页面定时任务中被发现,且执行结果为return的值111,在worker日志中可以看到print的值和return的值

5.迁移数据库,会生成celery-result和celery-beat相关的表
6.启动Django服务:python manage.py runserver 8000
7.启动celery-worker:celery -A new_project worker -l debug -P eventlet
8.启动celery-beat: celery -A new_project beat -l info

9.定时任务:
如果第3点手动配置了任务,则任务会自动运行,若未配置可以手动配置
登录后台admin/: http://127.0.0.1:8000/admin/ 使用admin账号进行登录
登录后点击"周期性任务"后面的增加进行定时任务增加,设置相关信息,其中任务已注册的选项来源于所有app里面task.py里面的方法

10.建议开始时间选择从00:00:00开始,保存后定时任务开始执行,可以在worker日志中查看任务执行情况


遇到的问题:
1.Django从3切到4版本,无法识别django.urls库导入url
解决:把from django.conf.urls import url 修改为 from django.urls import re_path as url

2.定时任务可在admin/页面手动执行,但是定时任务在worker中未执行
解决:应该是时间问题,把任务时间调整到从00:00:00开始后,任务正常执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django Celery 是一个用于 Django 框架的分布式任务队列工具。它结合了 Django 的 Web 开发能力和 Celery 的异步任务处理能力。通过使用 Celery,你可以将耗时的任务(如发送电子邮件、处理图像、执行定时任务等)从主线程中分离出来,以提高应用的性能和响应速度。 你可以通过以下步骤来集成 DjangoCelery: 1. 安装 Celery:在命令行中使用 pip 安装 Celery 库:`pip install celery` 2. 配置 Celery:在 Django 项目的 settings.py 文件中配置 Celery 相关的设置,主要包括消息代理器(message broker)的设置和任务结果存储的设置。 3. 创建任务:在 Django 项目中创建需要异步执行的任务。任务是一个 Python 函数,使用 `@task` 装饰器进行标记。 4. 启动 Celery Worker:在命令行中使用 `celery -A your_project_name worker --loglevel=info` 启动 Celery Worker,该命令会监听并执行任务队列中的任务。 5. 触发任务:在你的 Django 代码中调用任务函数,可以使用 `your_task.delay()` 来触发异步执行任务。 这样,当你触发任务时,它会被添加到 Celery 的任务队列中,并由 Celery Worker 异步执行。执行结果可以存储在指定的结果存储中,也可以通过回调函数获取。 注意:配置消息代理器和结果存储器时,你可以选择使用不同的后端,如 RabbitMQ、Redis、Amazon SQS 等。 以上是关于 Django Celery 的简要介绍和基本使用步骤,如果你有具体问题或需要更详细的指导,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lytcreate.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值