• 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 os
    from 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 Order
    from mycelery.main import app
    from datetime import datetime, timedelta
    from 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 crontab
    from .main import app
    # 定时任务的调度列表,用于注册定时任务
    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)#注意:任务就是一个函数,所有如果有参数则需要传递
          }
    }
    

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

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

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

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

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

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

    import os
    from 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 django
    django.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框架

  • 相关阅读:
    在使用SMO时,检索IsSystemObject属性将导致性能急剧下降的解决方法
    在没有安装.NET Framework 3.5的机器上使用LINQ等特性
    我的网站中的组织层次结构图信息与AD的同步问题
    有关视图状态(ViewState)的一些问题
    窗体控件visible属性问题
    SiteMapNode的几个特殊属性
    创建本地数据库时发生错误及其解决方案
    在基于Windows验证的Web应用程序中检索当前用户的所有角色
    在数据库恢复之前将数据库置为单用户模式
    将ASP.NET网站嵌入到MOSS站点下面的做法
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13751867.html
Copyright © 2020-2023  润新知