• django orm信号机制 + apschedule 定时任务


    最近开发个功能,需要在某个表的字段发生变化时触发定时执行的任务。查阅资料,好像mysql不支持在数据库层面监听数据的更改,就考虑从框架这边入手。

    就这样就找到了django的信号机制,它可以在请求开始、结束,模型发生变化的时候触发信号去执行另一个任务。刚好满足我的需求。

    信号触发实现原理:

    import  model

    from django.db.models.signals import post_delete, post_save  
    from django.dispatch import receiver
     
    @receiver(post_save,sender=model)  #装饰器绑定信号post_save,sender=model 是操作的模型是实例
    def SingalFunction(sender,**kwargs):
      model_instance=kwargs['instance']
      #model新增操作
      if kwargs['created']==True:       #参数里的created判断是新增还是更新模型
        task.CreateTask()
      elif kwargs['created'] ==False:
        task.UpdateTask()
    这样就写好了定时任务的触发了。
     
    下面就是apschedule来实现定时任务的执行了:
    apschedule是个第三方库需要 pip install apschedule下
    它有两种常用的schedule,分别是blocking  和 background:我们采用的是background 原因呢:可以后台执行、可以多线程、多进程,也就是说可以应付多个定时任务
    from apscheduler.schedulers.background import BackgroundScheduler
    from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore        #定时任务默认存在内存上,要修改存储方式需要这个类
     
    url="mysql+pymysql://"USER:PASSWORD@localhost/DATABASENAME'    #job存到mysql数据库
    sched =BackgroundScheduler(jobstores={
    'default': SQLAlchemyJobStore(
    tablename='appui_job',
    url=url)
    })
    sched.add_job(
          ,runfunction      #需要执行的方法
          ,args=[]            #方法的参数
          ,trigger='interval'  #定时任务的执行模式有四种吧:  这里用的是间隔
          ,id='001'           #job的ID,这个是job的唯一标识,建议不要重复,保存到数据库时,它是没用做为唯一判断的
          ,weeks=schedule_instance.week    #下面是触发任务的时间设置
          ,days=day
          ,hours=schedule_instance.hour
          ,minutes=schedule_instance.minute
          )
     
    sched.start()    就启动了
     
    写这个好累啊,,写个大概记录下吧。。
                          
     
     
     
     
  • 相关阅读:
    discuz制作
    Cookie和Session专题
    ecmall二次开发 直接实例化mysql对象
    ecmall widgets 挂件开发详解
    都是iconv惹的祸
    discuz+ecmall+phpcms整合
    replace into
    权限管理设计二
    权限管理设计一
    SVN服务器搭建和使用(二)
  • 原文地址:https://www.cnblogs.com/summers-willi/p/13612464.html
Copyright © 2020-2023  润新知