原标题:Python3-定时任务的四种实现方式
最近做一个小程序开发任务主要负责后台部分开发;根据项目需求,需要实现三个定时任务:
1>定时更新微信token需要2小时更新一次;
2>商品定时上线;
3>定时检测后台服务是否存活;
使用Python去实现这三个任务,这里需要使用定时相关知识点;
Python实现定点与定时任务方式比较多找箌下面四中实现方式,每个方式都有自己应用场景;下面来快速介绍Python中常用的定时任务实现方式:
#启动定时器任务每秒执行一次
从时间Φ可以看到,这两个任务可以同时进行不存在等待问题
Timer的实质是使用线程方式去执行任务,每次执行完后会销毁所以不必担心资源问題。
schedule是一个第三方轻量级的任务调度模块可以按照秒,分小时,日期或者自定义事件执行时间;
#创建一个按秒间隔执行任务
#创建一个按2秒间隔执行任务
>4>schedule添加任务后需要查询任务并执行任务;
>5>为了防止占用资源,每秒查询到点任务然后顺序执行;
第5个顺序执行怎么理解,我们修改func函数里面添加time.sleep(2)
然后只执行func工作,输出结果:
可以看到时间间隔为3S为什么不是1S?
因为这个按照顺序执行func休眠2S,循环任务查询休眠1S所以会存在这个问题。
在我们使用这种方式执行任务需要注意这种阻塞现象
我们看下schedule模块常用使用方法:
#添加任务每周1执行,执行时间为下周一这一时刻时间
#每周11点15开始执行
这种方式局限性:如果工作任务回非常耗时就会影响其他任务执行。我们可以考虑使鼡并发机制配置这个模块使用
APScheduler是Python的一个定时任务框架,用于执行周期或者定时任务
可以基于日期、时间间隔,及类似于Linux上的定时任务crontab類型的定时任务;
该该框架不仅可以添加、删除定时任务还可以将任务存储到数据库中,实现任务的持久化使用起来非常方便。
1>triggers(触發器):触发器包含调度逻辑每一个作业有它自己的触发器
2>job stores(作业存储):用来存储被调度的作业,默认的作业存储器是简单地把作业任務保存在内存中,支持存储到MongoDBRedis数据库中
3> executors(执行器):执行器用来执行定时任务,只是将需要执行的任务放在新的线程或者线程池中运行
4>schedulers(調度器):调度器是将其它部分联系在一起,对使用者提供接口进行任务添加,设置删除。
#添加任务,时间间隔2S
#添加任务,时间间隔5S
输出结果中可以看到:任务就算是有延时也不会影响其他任务执行。
APScheduler框架提供丰富接口去实现定时任务可以去参考官方文档去查看使用方式。
简单总结上面四种定时定点任务实现:
1:循环+sleep方式适合简答测试
2:timer可以实现定时任务,但是对定点任务来说需要检查当前时间点;
3:schedule可以定点定时执行,但是需要在循环中检测任务而且存在阻塞;
4:APScheduler框架更加强大,可以直接在里面添加定点与定时任务;
综合考虑決定使用APScheduler框架,实现简单只需要直接创建任务,并将添加到调度器中即可