Golang Go语言中给定时任务包 robig/cron 写了一个 @interval feature,支持同一定时任务只有一个在跑

Golang Go语言中给定时任务包 robig/cron 写了一个 @interval feature,支持同一定时任务只有一个在跑

项目地址: https://github.com/LampScript/cron

一句话说明白:添加了 [@interval](/user/interval) 前缀用来执行定时任务,每个任务交替进行,不会因为某几次任务执行时间过长导致多个任务同时执行。

  • 背景。在公司做项目的时候用到这个包写定时任务,考虑到单次任务在数据量大的时候执行速度慢,上一个没执行完下个任务又开始跑了,数据高峰时期可能会有问题,看下源代码是每次任务都一个协程单独跑,所以可能会有问题。

  • 思考。读完源代码后思考了一下感觉实现起来并不会太难,每个任务作者封装在一个实体数组中的,并且按下次执行时间从早到晚排序,支持运行时插入。

  • 动手。考虑到任务执行时间不可预测,每次执行 @interval 执行时将此任务剔除所有定时任务列表,并且执行完成后再添加回去,并且排序。

最后。pr 已经提给原作者。

第一次给开源项目贡献代码,求夸夸。


更多关于Golang Go语言中给定时任务包 robig/cron 写了一个 @interval feature,支持同一定时任务只有一个在跑的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

夸夸你,虽然标题和描述我都没看懂。(:з」∠)

更多关于Golang Go语言中给定时任务包 robig/cron 写了一个 @interval feature,支持同一定时任务只有一个在跑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好尴尬。。其实就是定时任务如果任务执行时间超过设置的间隔时间的话,就会都两个协程同时做一件事情。我加了一个 feature 来避免这个情况。

在Golang中使用robig/cron包来实现定时任务,并添加@interval特性以确保同一时间只有一个任务实例在运行,是一个比较常见的需求。以下是一些建议,帮助你实现这一目标:

  1. 使用互斥锁(Mutex): 在任务执行前,使用一个全局的互斥锁来保护任务代码块,确保同一时间只有一个任务实例在执行。这种方法简单直接,但可能会影响任务的并发性能。

  2. 任务状态管理: 维护一个任务状态(如“正在运行”、“空闲”),在任务开始前检查状态,如果任务已经在运行,则跳过当前触发。这种方法需要额外的状态管理逻辑。

  3. 使用任务队列: 将任务添加到队列中,由一个单独的goroutine负责处理队列中的任务。这样可以确保任务按顺序执行,避免并发冲突。

  4. 结合robig/cron的扩展性robig/cron包可能本身不支持@interval特性,但你可以通过扩展包的功能来实现。例如,可以监听任务的添加事件,为每个任务添加一个唯一的标识符,并使用上述方法之一来管理任务的并发执行。

  5. 考虑使用其他库: 如果robig/cron不满足你的需求,可以考虑使用其他更强大、更灵活的定时任务库,如robfig/cron,它提供了更丰富的功能和更好的社区支持。

总之,实现这一功能的关键在于合理管理任务的并发执行,确保系统的稳定性和可靠性。

回到顶部