最近开发个功能,需要在某个表的字段发生变化时触发定时执行的任务。查阅资料,好像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() 就启动了
写这个好累啊,,写个大概记录下吧。。