Django项目中celery和celery定时任务的基本使用

celery的基本使用

项目的目录结构:

django_celery_demo/   # 项目的根路径
├── django_celery_demo/  # 项目主目录,包目录
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── celery_ds/   # Celery 目录
    ├── add/   # 任务目录
    │   ├── __init__.py
    │   └── tasks.py  # 定义任务文件
    ├── __init__.py
    ├── main.py  # Celery 入口文件
    └── config.py  # Celery 配置文件
目录和文件说明
  1. django_celery_demo/: 项目的根路径,包含了整个 Django 项目和 Celery 配置的结构。

  2. django_celery_demo/django_celery_demo/: 项目的主目录,也是包目录,包含了 Django 项目的设置、路由等。

    • __init__.py: 标识该目录为 Python 包目录。

    • asgi.py: ASGI 兼容的应用服务器入口。

    • settings.py: Django 项目的主要设置文件,包含项目的配置选项。

    • urls.py: 定义项目的 URL 映射关系。

    • wsgi.py: WSGI 兼容的 Web 服务器入口。

  3. celery_ds/: Celery 的目录,用于存放 Celery 相关的文件和配置。

    • add/: 任务目录,可能包含多个不同类型的 Celery 任务。

      • __init__.py: 标识该目录为 Python 包目录。

      • tasks.py: 定义 Celery 任务的具体实现。

    • __init__.py: 标识该目录为 Python 包目录。

    • main.py: Celery 的入口文件,通常用于启动 Celery Worker 和 Celery Beat。

    • config.py: Celery 的配置文件,包含 Celery 应用的配置选项。

步骤一:安装celry和消息代理

1.安装celery和消息代理

  • 在django的项目环境中安装celery和消息代理(如rabbitmq或者redis),这里采用redis。

pip install celery -i https://pypi.tuna.tsinghua.edu.cn/simple
 
pip install eventlet -i https://pypi.tuna.tsinghua.edu.cn/simple
​
pip install redis-i https://pypi.tuna.tsinghua.edu.cn/simple

Celery、Eventlet和Redis的作用:

  1. Celery

    • 作用:Celery 是一个任务队列(Task Queue),用于处理异步任务和分布式任务调度。它允许你将任务放入队列中,并由工作者(workers)异步执行,支持延迟任务调度、定时任务等功能。

    • 主要特点:可扩展性强,支持多种消息代理(如Redis、RabbitMQ等),易于集成到现有项目中进行异步任务处理。

  2. Eventlet

    • 作用:Eventlet 是一个基于协程的并发框架,用于实现高效的非阻塞 I/O 操作。它能够在单个线程内管理多个并发任务,避免了传统多线程/多进程模型中的上下文切换开销,特别适合处理 I/O 密集型任务。

    • 主要特点:轻量级、高效,通过协程实现并发,简化了编程模型并提高了系统的并发处理能力。

  3. Redis

    • 作用:Redis 是一个高性能的键值存储系统,常用作数据缓存、消息队列的后端,以及分布式锁等。在 Celery 中,Redis 主要作为消息代理(broker)和结果存储后端(result backend)使用,用于存储任务队列和任务执行结果。

    • 主要特点:快速响应、支持多种数据结构和持久化方式,可靠地支持高并发的数据访问和存储需求。

步骤二:创建celery的python包和结构

1.这里我在django项目的根目录下面新建一个名为 celery_ds的python包,在celery_ds里面新建 config.py main.py,新建一个名为add的python包,这里的main.py是celery的入口,config.py是celery的配置信息,这里的add就是我们的任务。

  • 在main.py中编写如下内容:

    #main.py
    #导入celry
    from celery import Celery
    #创建celry实例
    celery_app = Celery("celery_ds")
    # 加载celery配置文件
    celery_app.config_from_object('celery_ds.config')
    ​
    # 自动注册celery任务
    celery_app.autodiscover_tasks(['celery_ds.add'])
    ​
    #启动celery
    #-A 指对应的应用程序, worker 指要启动的worker , -l 指日志等级 ,-P 用 Eventlet 作为并发池
    # celery -A celery_app.main worker -l info -P eventlet
  • 在config.py中编写配置信息:

  • #消息队列位置
    broker_url = 'redis://127.0.0.1/10'
    # 启用启动时的 broker 连接重试
    broker_connection_retry_on_startup = True

步骤三:定义celery任务

  • 在add中新建一个tasks.py文件(这里必须使用tasks.py),并编写任务:

    #导入celery应用实例
    from celery_ds.main import celery_app
    ​
    #定义celery任务
    #这里使用了 `@celery_app.task` 装饰器,它将普通的 Python 函数 `add` 转换成一个 Celery 任务。
    @celery_app.task
    def add(x,y):
        print('111')
        return '执行成功!!!'

    在其他地方调用这个任务: 你可以在 Django 或其他 Python 代码中调用这个 Celery 任务来异步执行任务。例如:

    result = add.delay(3, 4)

    这里的 add.delay(3, 4) 将会异步执行 add 函数,参数为 34,并返回一个 AsyncResult 对象 result,可以用它来获取任务的状态和结果。

步骤四:启动celery worker

  • 在控制台中切换到项目目录下面(可以看到celery_ds文件夹的这一层),输入:

#启动celery
#-A 指对应的应用程序, worker 指要启动的worker , -l 指日志等级 ,-P 用 Eventlet 作为并发池
celery -A celery_app.main worker -l info -P eventlet

celery定时任务

在 Celery 中,定时任务可以通过 Celery Beat 来实现。Celery Beat 是 Celery 自带的一个调度器,用来调度执行周期性任务。

定义定时任务

在 Celery 应用中定义需要定时执行的任务。例如:

#celery_ds.add.tasks.py
​
....
import datetime
@app.task
def get_currenttime():
    print(datetime.now())

配置定时任务调度器(Celery Beat)

Celery Beat 是一个独立于 Worker 的进程,负责按预定的时间调度任务执行。通常在启动 Celery Worker 之前,启动 Beat 进程。

在 Celery 应用的配置中,设置定时任务的调度:

#config.py
...
#导入crontab函数,来定义任务调度时间
from celery.schedules import crontab
app.conf.beat_schedule = {
    'send-email-every-morning': {
        'task': 'celery_ds.add.tasks.get_currenttime',
        'schedule': crontab(hour=7, minute=30),  # 每天早上 7:30 执行
        #'schedule': 30.0,  # 30秒执行一次。
        'args': (),  # 如果有参数,可以在这里设置
    },
    # 这里可以添加更多的定时任务
}

# 设置时区为亚洲上海时区
timezone = 'Asia/Shanghai'

这里使用 crontab 对象来指定定时任务的执行时间。除了 crontab,还可以使用 timedeltaschedule 字符串等形式来定义定时执行的规则。

运行 Celery Worker 和 Beat

启动 Celery Worker 和 Beat 进程:

celery -A celery_app.main beat -l info

-A celery_app.main 指定 Celery 应用的模块名。

至此,你便可以根据代码来调试修改实现你想要实现的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值