两总定时任务调度器的调度实现对比
前言
基于 golang 做项目开发的实践中,经常碰到需要任务的定时执行,所以不可避免地需要使用到定时任务管理器。现将常用的两款定时任务管理器拉出来,分析分析其实现机制,并总结如何在不同的场景下选择合适的定时任务管理器。
这两种定时任务管理器分别为:
alex023/clock: https://github.com/alex023/clock
robfig/cron: https://github.com/robfig/cron
alex023/clock
直接上任务调度核心代码:(PS: 以下的 Job 都指单个定时任务)
分析其源码实现,可知其特性:
每次添加或删除 Job 实例,都需要停止调度器的执行,并重新组织 Jobs;
使用红黑数来组织 Job 实例,查找、插入、删除的时间复杂度为 O(lgn);
允许添加及删除 Job 实例;
robfig/cron
直接上任务调度核心代码:
分析其源码实现,可知其特性:
只允许添加,不允许删除 Job;
使用普通的链表来组织 Job 实例,使用 sort.Sort()对链表进行排序,其理想情况下的时间复杂度为 O(nlgn); 故其读 Job 的时间复杂度为 O(1), 写 Job 的时间复杂度为 O(nlgn)。
对比与总结
从时间复杂度角度出发:clock 对 Job 的读写时间复杂度都为 O(lgn); cron 对 Job 的读写时间复杂度分别为 O(1)及 O(nlgn); 综合来看,clock 对 Job 操作的时间复杂度为 O(lgn), cron 对 Job 操作的时间复杂度为 O(nlgn); 故当 n(定时任务数)较大时,clock 对定时任务的调度具有性能优势;
从对 Job 操作的角度出发:clock 允许添加及删除 Job, cron 只允许添加 Job; 故当需要定时任务删除操作时,只能选 clock 方案;
从 API 使用角度出发:clock 方案为实现可随时删除 Job 的功能,需要额外维护一个 map 来存储具体的 Job 信息;其 API 使用起来较 cron 繁琐;相比之下 cron 方案的 API 更加简洁,相关定时配置也更加灵活;
从 Job 的性质出发:cron 更适合执行周期性执行的定时任务,clock 更适合执行非周期性执行的定时任务。
版权声明: 本文为 InfoQ 作者【xyu】的原创文章。
原文链接:【http://xie.infoq.cn/article/3f3c831c83f3e51c73fdae5e0】。文章转载请联系作者。
评论