djnago框架+celery框架使用:将django逻辑加到异步任务中执行

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': (),  # 任务需要传递的参数
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值