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()    就启动了
 
写这个好累啊,,写个大概记录下吧。。
                      
 
 
 
 
原文地址:https://www.cnblogs.com/summers-willi/p/13612464.html