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 配置文件
目录和文件说明
-
django_celery_demo/: 项目的根路径,包含了整个 Django 项目和 Celery 配置的结构。
-
django_celery_demo/django_celery_demo/: 项目的主目录,也是包目录,包含了 Django 项目的设置、路由等。
-
__init__.py
: 标识该目录为 Python 包目录。 -
asgi.py
: ASGI 兼容的应用服务器入口。 -
settings.py
: Django 项目的主要设置文件,包含项目的配置选项。 -
urls.py
: 定义项目的 URL 映射关系。 -
wsgi.py
: WSGI 兼容的 Web 服务器入口。
-
-
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的作用:
Celery:
作用:Celery 是一个任务队列(Task Queue),用于处理异步任务和分布式任务调度。它允许你将任务放入队列中,并由工作者(workers)异步执行,支持延迟任务调度、定时任务等功能。
主要特点:可扩展性强,支持多种消息代理(如Redis、RabbitMQ等),易于集成到现有项目中进行异步任务处理。
Eventlet:
作用:Eventlet 是一个基于协程的并发框架,用于实现高效的非阻塞 I/O 操作。它能够在单个线程内管理多个并发任务,避免了传统多线程/多进程模型中的上下文切换开销,特别适合处理 I/O 密集型任务。
主要特点:轻量级、高效,通过协程实现并发,简化了编程模型并提高了系统的并发处理能力。
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
函数,参数为3
和4
,并返回一个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
,还可以使用 timedelta
、schedule
字符串等形式来定义定时执行的规则。
运行 Celery Worker 和 Beat
启动 Celery Worker 和 Beat 进程:
celery -A celery_app.main beat -l info
-A celery_app.main
指定 Celery 应用的模块名。
至此,你便可以根据代码来调试修改实现你想要实现的功能。