zoukankan      html  css  js  c++  java
  • 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()    就启动了
     
    写这个好累啊,,写个大概记录下吧。。
                          
     
     
     
     
  • 相关阅读:
    简单SSM配置详解
    Nginx 简介
    序列化与反序列化
    用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
    Linux
    jsp标签精华(持续更新中)
    ZooKeeper 编程(一)
    maven环境快速搭建
    Web项目--------原Oracle数据库的项目同时兼容MySql
    JavaMail实现邮箱之间发送邮件功能
  • 原文地址:https://www.cnblogs.com/summers-willi/p/13612464.html
Copyright © 2011-2022 走看看