celery定时任务

网友投稿 293 2022-08-29


celery定时任务

定时任务常见场景

1.订单超时2.生日邮件[例如,每天凌晨检查当天有没有用户生日,有则发送一份祝福邮件]3.财务统计[例如,每个月的1号,把当月的订单进行统计,生成一个财务记录,保存到数据库中]4.页面缓存[列如,把首页设置为每隔5分钟生成一次缓存]

使用celery的定时任务来完成订单超时功能

在实现定时任务之前,我们需要先简单使用以下 我们需要新增一个任务目录,例如order

celey_tasks/ ├── sms/ │ ├── __init__.py │ └── tasks.py ├── config.py ├── __init__.py ├── main.py ├── order/ │ ├── __init__.py │ └── tasks.py └── sms

在main.py中,注册任务目录[注意,接下来后面我们使用django的模型处理,所以必须对django的配置进行引入]

import osfrom celery import Celery# 1.创建示例对象app = Celery('luffy')# 2.加载配置app.config_from_object('celery_tasks.config')# 3.注册任务[自动搜索并加载任务]# 参数必须必须是一个列表,里面每一个任务都是任务的路径名称# app.autodiscover_tasks(['任务1','任务2'])app.autodiscover_tasks(['celery_tasks.sms','celery_tasks.order'])# 4.在终端下面运行celery命令启动celery# celery -A 主程序 worker --loglevel=info# celery -A celery_tasks.main worker --loglevel=info

接下来,在order任务目录下,创建固定名字的任务文件taks.py,代码

from order.models import Orderfrom mycelery.main import appfrom datetime import datetime, timedeltafrom luffyapi.settings import contants@app.task(name='check_oo') #起别名,如果起了别名,那么config中调度任务写别名就行def check_order(): """订单超时取消任务""" # 超时条件,当前时间 > 订单生成时间+超时时间 = 超时了 # 当前时间 - 超时时间段 > 订单生成时间 = 超时了 now_time = datetime.now() #当前时间 out_time = contants.ORDER_OUTTIME # 配置文件中设置的超时时间 # 超时时间点 order_out_time = now_time - timedelta(seconds=out_time) order_list = Order.objects.filter(order_status=0, created_time__lt=order_out_time) for order in order_list: order.order_status = 3 order.save()

接下来,我们需要把这个任务设置定时任务,所以需要借助celery本身提供的Crontab模块 在配置文件config.py中,对定时任务进行注册

# 任务队列的链接地址broker_url = 'redis://127.0.0.1:6379/15'# 结果队列的链接地址result_backend = 'redis://127.0.0.1:6379/14'from celery.schedules import crontabfrom .main import app# 和django框架同步时区from django.conf import settingsapp.conf.timezone = settings.TIME_ZONE# 定时任务的调度列表,用于注册定时任务app.conf.beat_schedule = { 'check_order_outtime':{ #任务名称随便起 # 本地调度的任务 'task': 'check_order',# 这里的任务名称必须先到main.py中注册,如果写了别名,直接写别名就可以了,没有写别名,需要用路径写法order.tasks.check_order # 定时任务的调度周期 #'schedule': crontab(minute=0, hour=0),# 每周凌晨00:00 'schedule': crontab(), #每分钟,没写秒数,那么就是每分钟的0秒开始 # 'args': (16, 16)#注意:任务就是一个函数,所有如果有参数则需要传递 # 'kwargs' 有名参数 }}

接下来,我们就可以重启celery并启用celery的定时任务调度器,现在终端下,运行celery的定时任务程序,以下命令:

celery -A mycelery.main beat # mycelery.main是celery的主应用文件

然后再创建一个终端,运行以下命令,上面的命令必须先指定:

celery -A mycelery.main worker --loglevel=info

注意,使用的时候如果有时区必须先配置好系统时区

要完成订单的任务功能,如果需要调用django框架的模型操作,那么必须针对django框架进行配置加载和初始化。main.py文件

import osfrom celery import Celery# 1.创建实例对象app = Celery('luffy')# 2.把celery和django进行组合,识别和加载django的配置文件os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')# 3.在当前celery中启动django框架,对django框架进行进行初始化import djangodjango.setup()# 4.加载配置app.config_from_object('celery_tasks.config')# 5.注册任务[自动搜索并加载任务]# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称# app.autodiscover_tasks(['任务1','任务2'])app.autodiscover_tasks(['celery_tasks.sms','celery_tasks.order'])# 6.在终端下面运行celery命令启动celery# celery -A 主程序 worker --loglevel=info# celery -A celery_tasks.main worker --loglevel=info

参考文档

​​celery定时任务,可适用于任何框架​​​​django-crontab,只适用于django框架​​

-------------------------------------------

个性签名:代码过万,键盘敲烂!!!

如果觉得这篇文章对你有小小的帮助的话,记得“推荐”哦,博主在此感谢!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:abc模块的用法(ABC接口)
下一篇:itertools模块(itertools模块java有吗)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~