安装包
pip install celery
pip install eventlet
1.在项目文件的根目录下创建目录结果
2. 在main.py文件中
# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# Author :skyTree
# version :python 3.11
# Description:celery 主文件
"""
from celery import Celery
# 1,创建celery实例对象
celery_app = Celery('meiduo')
# 2,加载配置文件
celery_app.config_from_object('celery_tasks.config')
# 3,自动注册异步任务
celery_app.autodiscover_tasks(['celery_tasks.sms'])
3.config.py文件
# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# Author :skyTree
# version :python 3.11
# Description:celery 配置文件
"""
# 指定任务队列的位置
broker_url = "redis://localhost:6379/0"
4.在项目后端文件下执行启动命令,即可,此时说明clery已经安装成功!
# celery_tasks.main为celery包名加主文件
celery -A celery_tasks.main worker -l info
5.在task.py文件中将发送短信的任务注册到task中必须使用装饰器并在装饰器中设置别名便于区分
# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# Author :skyTree
# version :python 3.11
# Description:sms功能异步任务
"""
from .send_sms import Send_SMS
from ..main import celery_app
@celery_app.task(name='send_sms_code')
def send_sms_code(mobile, sms_code):
"""
发送短信验证码的celery异步任务
:param mobile: 手机号
:param sms_code: 验证码
:return:
"""
Send_SMS().send(mobile=mobile, code=sms_code)
6.在视图函数中调用异步任务
# apply_async接受的参数必须为元组或者列表
result = send_sms_code.apply_async((mobile, sms_code,))
# 使用dealy方法也可以
result = send_sms_code.dealy(mobile, sms_code)
7.执行celery启动命令
注意: 必须使用 celery -A celery_tasks.main worker -l info -P eventlet 才会提示如下信息表示成功
如果使用 celery -A celery_tasks.main worker -l info 命令显示如下信息,此时任务根本没有执行
8.设置定时和周期性任务
8.1 安装包
pip install django-celery-beat
8.2 在INSTALLED_APPS中注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_celery_beat', # 周期和定时任务
'backend'
]
8.3 在settings中配置文件添加任务
CELERY_BEAT_SCHEDULE = {
"add-every-30s": {
"task": "backend.tasks.add_number", # 任务路径
'schedule': 30.0, # 每30秒执行1次
'args': (1, 8) # 传递参数-
}
}
8.4 执行命令
执行 celery -A your_project_name worker -l info
用于启动任务
执行 celery -A your_project_name beat -l info 用于查看 周期任务结构
8.5 定时任务
CELERY_BEAT_SCHEDULE = {
....
# 每周五下午2点执行
'add-every-friday-afternoon': {
'task': 'backend.tasks.add_number',
'schedule': crontab(day_of_week='5', hour='14', minute='0'),
'args': (7, 8),
},
}
结果: