当前位置:主页 > 脚本语言 > Golang >

详解golang 定时任务time.Sleep和time.Tick实现结果比较

时间:2022-07-04 14:06:29 | 栏目:Golang | 点击:

总的来说

现在来看一下 两种方法实现出来的效果有何不同

这里我们设置定时时长为5

使用“Do Something” 来模拟定时任务执行需要的时间 分1s执行,10s执行两种情况

代码如下

func Test_Sleep(t *testing.T) {
    for i := 0; i < 3; i++ {
        Debug("begin", time.Now().Format("2006-01-02_15:04:05"))
        Debug("Do something 1s")
        time.Sleep(time.Second * 1)
        Debug("end", time.Now().Format("2006-01-02_15:04:05"))
        time.Sleep(time.Second * 5)
    }
}

func Test_Tick(t *testing.T) {
    t1 := time.NewTicker(5 * time.Second)(5 * time.Second)
    for {
        select {
        case <-t1.C:
            Debug("begin", time.Now().Format("2006-01-02_15:04:05"))
            Debug("Do something 1s")
            time.Sleep(time.Second * 1)
            Debug("end", time.Now().Format("2006-01-02_15:04:05"))
        }
    }
}

Sleep结果1:

2019/04/19 15:58:51 |DEBUG|Test_Sleep()|77|begin 2019-04-19_15:58:51
2019/04/19 15:58:51 |DEBUG|Test_Sleep()|78|Do something 1s
2019/04/19 15:58:52 |DEBUG|Test_Sleep()|80|end 2019-04-19_15:58:52
2019/04/19 15:58:57 |DEBUG|Test_Sleep()|77|begin 2019-04-19_15:58:57
2019/04/19 15:58:57 |DEBUG|Test_Sleep()|78|Do something 1s
2019/04/19 15:58:58 |DEBUG|Test_Sleep()|80|end 2019-04-19_15:58:58
2019/04/19 15:59:03 |DEBUG|Test_Sleep()|77|begin 2019-04-19_15:59:03
2019/04/19 15:59:03 |DEBUG|Test_Sleep()|78|Do something 1s
2019/04/19 15:59:04 |DEBUG|Test_Sleep()|80|end 2019-04-19_15:59:04

设置任务执行时间为1s
end到下一次begin之间的间隔为5s (定时间隔)
其过程大致为:
|DO–>|Sleep---------->|Do–>|Sleep---------->|

Trick结果1

2019/04/19 16:22:09 |DEBUG|Test_Trick()|90|begin 2019-04-19_16:22:09
2019/04/19 16:22:09 |DEBUG|Test_Trick()|91|Do something 1s
2019/04/19 16:22:10 |DEBUG|Test_Trick()|93|end 2019-04-19_16:22:10
2019/04/19 16:22:14 |DEBUG|Test_Trick()|90|begin 2019-04-19_16:22:14
2019/04/19 16:22:14 |DEBUG|Test_Trick()|91|Do something 1s
2019/04/19 16:22:15 |DEBUG|Test_Trick()|93|end 2019-04-19_16:22:15
2019/04/19 16:22:19 |DEBUG|Test_Trick()|90|begin 2019-04-19_16:22:19
2019/04/19 16:22:19 |DEBUG|Test_Trick()|91|Do something 1s
2019/04/19 16:22:20 |DEBUG|Test_Trick()|93|end 2019-04-19_16:22:20

设置任务执行时间为1s
end到下一次begin之间的间隔为4s (定时间隔-任务执行时间)
其过程大致为:
(begin)Do–>(end)
|DO–>-----------|Do–>-------------|
|Sleep---------->|Sleep---------->|

Sleep结果2:

2019/04/19 16:32:41 |DEBUG|Test_Sleep()|77|begin 2019-04-19_16:32:41
2019/04/19 16:32:41 |DEBUG|Test_Sleep()|78|Do something 10s
2019/04/19 16:32:51 |DEBUG|Test_Sleep()|80|end 2019-04-19_16:32:51
2019/04/19 16:32:56 |DEBUG|Test_Sleep()|77|begin 2019-04-19_16:32:56
2019/04/19 16:32:56 |DEBUG|Test_Sleep()|78|Do something 10s
2019/04/19 16:33:06 |DEBUG|Test_Sleep()|80|end 2019-04-19_16:33:06

设置任务执行时间为10s
end到下一次begin之间的间隔为5s (定时间隔)
其过程大致为:
|DO-------------------->|Sleep---------->|Do-------------------->|Sleep---------->|

Trick结果2

2019/04/19 16:41:05 |DEBUG|Test_Tick()|90|begin 2019-04-19_16:41:05
2019/04/19 16:41:05 |DEBUG|Test_Tick()|91|Do something 10s
2019/04/19 16:41:15 |DEBUG|Test_Tick()|93|end 2019-04-19_16:41:15
2019/04/19 16:41:15 |DEBUG|Test_Tick()|90|begin 2019-04-19_16:41:15
2019/04/19 16:41:15 |DEBUG|Test_Tick()|91|Do something 10s
2019/04/19 16:41:25 |DEBUG|Test_Tick()|93|end 2019-04-19_16:41:25

设置任务执行时间为10s
end到下一次begin之间的间隔为0s
此时因为任务执行时间大于定时间隔 当任务执行完毕时 已经没有阻塞 所以可以立马执行下一次
其过程大致为:
(begin)Do–>(end)
|DO-------------------->|Do----------------------->|
|Sleep---------->-------|Sleep---------->---------|

总结

从sleep和tick的实现结果的比较来看 可以发现

1.sleep进行定时任务 任务执行的时间对其实际定时间隔没有影响 睡眠紧跟在任务结束后
2.sleep的定时间隔时间 = 上一个end 到 下一个begin 的时间
3.而tick的实现 使用了一个协程来进行定时 任务执行的时间会对其实际间隔时间产生影响
4.tick的(上一个begin到下一个begin时间) = max (定时间隔时间, 任务执行时间)

至于孰好孰坏 好像一般都是推荐tick 不过还是要看具体的环境再来决定

参考:https://www.jb51.net/article/211330.htm

您可能感兴趣的文章:

相关文章