Django中celery的简单使用
安装
# pip安装
pip install -U celery # -U表示有celery则更新,没有就安装
# 安装包安装
# 官网下载安装包 https://pypi.org/project/celery/
tar xvfz celery-xx.tar.gz # 解压
cd celery-xx
python setup.py
python setup.py install
使用
目录结构介绍
api/
├── mycelery/
├── config.py # 配置文件
├── __init__.py
├── main.py # 主程序
└── app01task/ # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖,也可以每个任务单独一个目录
└── tasks.py # 任务的文件,名称必须是这个!!!
└── app02task/
└── tasks.py # 任务的文件,名称必须是这个!!!
内部文件介绍
main.py主程序文件
# 主程序
import os
from celery import Celery
# 创建celery实例对象
app = Celery("api")
# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.settings.dev')
# 在当前clery中启动django框架,对django框架进行进行初始化
import django
django.setup()
# 通过app对象加载配置,文件路径
app.config_from_object("mycelery.config")
# 自动搜索并加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["mycelery.app01task","mycelery.app02task"]) #会自动识别app01task目录下面的tasks.py文件中的任务,所以不需写成mycelery.app01task.tasks
config.py配置文件
# 任务队列的链接地址(变量名必须叫这个)
broker_url = 'redis://127.0.0.1:6379/14'
# 结果队列的链接地址(变量名必须叫这个)
result_backend = 'redis://127.0.0.1:6379/15'
from celery.schedules import crontab
from .main import app
# 定时任务的调度列表,用于注册定时任务
app.conf.beat_schedule = {
'app01_task': {
# 本次调度的任务
'task': 'app01task', # 这里的任务名称必须先到main.py中注册,如果写了别名,直接写别名就可以了
# 定时任务的调度周期
# 'schedule': crontab(minute=0, hour=0), # 每周凌晨00:00
'schedule': crontab(), # 每分钟,没写秒数,那么就是每分钟的0秒开始
# 'args': (16, 16), # 注意:任务就是一个函数,所以如果有参数则需要传递
},
}
tasks.py任务文件
# 任务必须写在tasks.py文件中,其他文件名无法识别
from mycelery.main import app
@app.task(name="app01task") # 这里写什么,main.py任务列表就写什么,不填写默认函数名
def apptask():
print("执行任务")
启动命令
# 先切换到项目的根目录下,也就是api下
# 执行celery的定时任务程序
celery -A mycelery.main beat
# 启动celery
celery -A mycelery.main worker --loglevel=info
# 注意: ValueError: not enough values to unpack (expected 3, got 0)问题
pip install eventlet
celery -A celery_tasks worker -l info -P eventlet