1、首先要明白celery框架是为了实现异步任务、延迟任务和定时任务的。
2、celery框架不依赖于django框架启动,需要在terminal下启动celery框架。
3、先弄一个redis数据库,可以使用的,celery框架需要这个数据库。
如何在django中使用celery框架:
一、按照官方推荐的方式来创建celery框架包。
1、创建一个包,在项目根目录下创建celery_task包(包名随意)
2、在celery_task包下,必须有celery.py文件,
celery.py文件内容:
from celery import Celery #导入django环境,#加载django环境, 【要执行django中的逻辑,引用到django模块,这四句必须有】 import django import os os.environ.setdefault("DJANGO_SETTINGS_MODULE","studentSystemt.settings.dev") django.setup() broker = 'redis://192.168.137.10/15'#broker任务队列 backend = 'redis://192.168.137.10/14'#结构存储,执行完的结果存在这里 app = Celery(__name__,broker=broker,backend=backend,include=['celery_task.emailtask','celery_task.task2'])
为什么要在celery中导入django环境?
回到一开始,这两个框架是相互独立的。celery框架要使用到django框架中的包和模块,就必须将django的环境导入。
3、创建任务文件
emailtask.py中的内容:
from .celery import app
from django.core.cache import cache
@app.task
def school_messege():
#获取cache中数据,这里就在执行django中的逻辑了。
messeges = cache.get('redis_messege_all')
print('定时执行了')
return 123
task2文件中的内容
from .celery import app
import time
@app.task
def mutile(x,y):
#逻辑
#返回值,保存到redis数据库中
return x*y
如何启动worker,在terminal切换到celery_task包的上级命目录下:
1、启动worker:celery -A celery_task worker -l INFO -P eventlet
2、要启动定时任务:celery -A celery_task beat -l INFO 【另开一个terminal】
4、如何使用异步、延迟和定时功能执行函数
在celery_task包同级目录下创建一个test.py进行测试:
a、实现异步任务:delay
from celery_task.task2 import mutile ret2 = mutile.delay(2,3) print(ret2)
b、执行延迟任务:使用utc时间
#执行延迟任务 from celery_task.task2 import mutile from datetime import datetime,timedelta #必须是utc时间,timedelta是时间对象,10秒后,days=, eta = datetime.utcnow()+timedelta(seconds=30) ret=mutile.apply_async(args=(10,5),eta=eta)
c、使用定时任务:定时任务是一开始就可以决定好的,直接写在celery.py文件中,进行配置。
【写到celery.py文件中】
#时区设置成东八区 app.conf.timezone='Asia/Shanghai' #禁用格林威治时区 app.conf.enable_utc=False #任务定时配置 from datetime import timedelta from celery.schedules import crontab app.conf.beat_schedule = { 'low-task1':{ #指定要执行的任务 'task':'celery_task.task2.mutile', #每10秒执行一次 # 'schedule':timedelta(seconds=3), #每周日的7:30执行 'schedule':crontab(hour=17,minute=30,day_of_week=6), 'args':(10,1) ,#任务需要传递的参数 }, 'low-task2': { # 指定要执行的任务 'task': 'celery_task.emailtask.school_messege', # 每10秒执行一次 'schedule':timedelta(seconds=4), # 每周一的7:30执行 # 'schedule': crontab(hour=16, minute=31, day_of_week=6), # 'args': (), # 任务需要传递的参数 } }