欢迎来到代码驿站!

Golang

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

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

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

总的来说

  • Sleep是使用睡眠完成定时,结束后继续往下执行循环来实现定时任务。
  • Tick函数是使用channel阻塞当前协程,完成定时任务的执行

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

这里我们设置定时时长为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

上一篇:go1.8之安装配置具体步骤

栏    目:Golang

下一篇:go语言之给定英语文章统计单词数量(go语言小练习)

本文标题:详解golang 定时任务time.Sleep和time.Tick实现结果比较

本文地址:http://www.codeinn.net/misctech/206788.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有