定时任务在编程之旅中是非常常见的需求,比如B站每天12点统计昨天总的播放量,我每天发邮件给老板拍马屁等


根据任务的阻塞与否可分为:

  • 同步任务

  • 异步任务

在golang中,执行异步定时任务非常简单,只需time包配合go协程即可

so elegant~


根据需求不同,一般有两种定时任务:

  1. 到达指定时间执行一次就完事的任务

  2. 每次到达一定时间就得执行一次的任务

上面两种需求,分别对应time包的两个结构体:Timer与Ticker


time.Timer

可以把Timer理解为,可以取消、重设的一次性闹钟

下面是关于它的所有内容:

例子:

1) 阻塞三秒后,继续执行:

这个例子等同于time.Sleep(3*time.Second)

2) 通过Stop方法,取消任务:

在协程里接收timer.C,随后取消任务,4秒后依然没有看到协程的输出,所以确实成功取消了任务

3) 通过Reset方法,重设任务:

4) 如果你的任务函数没有入参和出参,可以直接使用AfterFunc函数:

golang的time.Timer与JS的setTimeout函数几乎一模一样:

只是JS只有setTimeout和clearTimeout,没有重设,不过也可以组合两者达到重设的效果


time.Ticker

可以把Ticker理解为,可以取消、重设的周期性闹钟

下面是关于它的所有内容:

例子:

1) 3秒输出一次hello:

2) 取消和重设的功能和Timer一样,就不演示了

3) 如果Ticker不需要取消和重设,可以用Tick函数:

和例1是一样的效果:

4) Ticker没有像Timer一样的AfterFunc函数(其实AfterFunc也没什么大用)


golang的time.Ticker与JS的setInterval函数几乎一模一样:

同样也是没有重设的功能







that's all, hope it's helpful to u, thanks