ThreadPoolTaskScheduler动态添加、移除定时任务

ThreadPoolTaskScheduler动态添加、移除定时任务,第1张

最近遇到一个需求,定时任务的业务逻辑不会改变,但需要动态添加、移除定时任务,而且定时执行时间有可能随时改变,这可怎么实现呢?

首先,配置定时任务线程池;

第二步,建立任务,里面包含了定时任务需要实现的业务逻辑;

第三步,应用定时任务,包括添加、移除;

最后,运行入口程序,打开浏览器进行测试; 通过浏览器分别执行了localhost:8080/index/insert/1000/10、localhost:8080/index/insert/2000/20,也就是添加了两个任务,任务1000每10s执行一次,任务2000每20s执行一次;

执行 http://localhost:8080/index/remove/1000 ,把1000的任务移除掉,再看执行结果,只剩下任务2000,ok,动态添加、移除定时任务编码完成。

当然,这里为了测试,把管理任务的队列直接放到了Controller里,实际应用时应保持全局唯一。

最后总结

通过这个需求,我们又用到了一个类ThreadPoolTaskScheduler,它有别于ThreadPoolTaskExecutor类,有兴趣有时间的可以查看源码。

动态添加、移除定时任务的 *** 作流程,大致可以分为以下四个步骤:

1.建立一个定时任务线程池;

2.为定时任务线程池建立一个队列,来管理这些任务;

3.根据唯一标识,往定时任务线程池和队列里分别添加这个任务;

4.根据唯一标识,从定时任务线程池里取消一个任务,并从队列里移除这个任务。

可以基于tornado-APScheduler实现添加动态添加/删除/暂停/清除定时任务。

安装:pip3 install apsheduler

1.任何调度器在开始后,不能再次start。不然会出现异常

2.shutdown方法:终结掉对应的调度器,所以代码逻辑里需要检测一下. running方法可以判断调度器的运行状态,如果需要设计delete方法清除某个任务,建议用remove方法,对应代码逻辑需要注意start()不要重复

3.注意BlockingScheduler,如果你想动态添加任务的话,这个调度器是阻塞的,所以每个任务必须是一个守护线程,个人感觉不太方便,建议用其他非阻塞的

4. get_jobs()方法很有用,如果我们加上dir,配合这个方法可以很灵活地配置

5.修改一个周期任务,需要用modify_job方法,根据你的job_id修改

Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11473497.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存