热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

详解golang 定时任务time.Sleep和time.Tick实现结果比较-总的来说Sleep是使用睡眠完成定时,结束后继续往下执行循环来实现定时任务。Tick函数是使用cha

总的来说

  • 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 不过还是要看具体的环境再来决定


推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 数据库技术:execute immediate
    首先在这里发发牢骚,指责下那些刻板的书写方式,不考虑读者理不理解,感觉就是给专业人员用来复习用的一样,没有前戏,直接就高潮,实在受不了!没基础或基础差的完全不知道发生了什么,一脸懵 ... [详细]
  • 我们使用pythonunit ... [详细]
  • 一、申明slice会产生什么1.1申明slice当咱们申明一个slice类型,它理论的值什么?{代码}如上咱们申明了一个[]int的slice切片类型输入如下:{代码 ... [详细]
  • 鄂维南:从数学角度,理解机器学习的「黑魔法」,并应用于更广泛的科学问题...
    作者|Hertz来源|科学智能AISI北京时间2022年7月8日晚上22:30,鄂维南院士在2022年的国际数学家大会上作一小时大会报告(plenarytalk)。今 ... [详细]
  • testcafe的版本-1.7.0和1.7.1(最新)铬版本-78.0.3904.108运行环境 ... [详细]
author-avatar
再见vivian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有