程序设计目标是在程序启动10秒后执行某个任务,例如日志转储(rotate),以后每隔15秒执行一次。

初次的设计

package main

import (
"time"
"fmt"
) func main() {
timer := time.NewTimer(10 * time.Second)
fmt.Println(time.Now())
for {
select {
case <-timer.C:
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
timer.Reset(15 * time.Second)
}
}
}

显然,在设置下一个定时(timer.Reset(15 * time.Second))之前,多少都会消耗一点时间,即使是毫秒级的延迟,也一定会产生累计误差。

为了使问题更明显,在程序中增加了一秒的 Sleep。测试结果如下:

2017-07-18 23:16:24.791623 +0800 CST
2017-07-18 23:16:34.7917567 +0800 CST
2017-07-18 23:16:50.7920782 +0800 CST
2017-07-18 23:17:06.7929373 +0800 CST
2017-07-18 23:17:22.7944063 +0800 CST
2017-07-18 23:17:38.7951302 +0800 CST
2017-07-18 23:17:54.7968096 +0800 CST
2017-07-18 23:18:10.7985468 +0800 CST
2017-07-18 23:18:26.7993588 +0800 CST
2017-07-18 23:18:42.7996568 +0800 CST
2017-07-18 23:18:58.8008621 +0800 CST

改进后的程序

package main

import (
"time"
"fmt"
) func main() {
next := time.Now().Add(10 * time.Second)
timer := time.NewTimer(next.Sub(time.Now()))
fmt.Println(time.Now())
for {
select {
case <-timer.C:
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
next = next.Add(15 * time.Second)
timer.Reset(next.Sub(time.Now()))
}
}
}

简单说就是增加了一个时间变量 next,在设置定时器之前,通过计算获得下一次任务的执行时间。

而定时器用 next - Now() 来设置。测试结果如下:

2017-07-18 23:16:20.2456695 +0800 CST
2017-07-18 23:16:30.2466397 +0800 CST
2017-07-18 23:16:45.2457191 +0800 CST
2017-07-18 23:17:00.2458328 +0800 CST
2017-07-18 23:17:15.2451861 +0800 CST
2017-07-18 23:17:30.2452624 +0800 CST
2017-07-18 23:17:45.2468138 +0800 CST
2017-07-18 23:18:00.245947 +0800 CST

从以上结果看,精度可控制在 ± 2ms。完全可以满足定时转储日志文件的需要。

log4go的精确定时程序(带自动延迟补偿)的更多相关文章

  1. 微信小程序—微信自动退款

    微信小程序—微信自动退款 一.业务背景 微信自动退款串接基于酷客多小程序商城系统,为方便财务人员进行订单退款而开发,将酷客多小程序系统财务退款流程和微信退款系统打通.实现一个系统管理运营. 二.业务流 ...

  2. VC中基于 Windows 的精确定时[转]

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  3. VC中基于 Windows 的精确定时

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  4. Android应用程序的自动更新升级(自身升级、通过tomcat)(转)

    Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...

  5. 分析nuget源码,用nuget + nuget.server实现winform程序的自动更新

    源起 (个人理解)包管理最开始应该是从java平台下的maven开始吧,因为java的开发大多数是基于开源组件开发的,一个开源包在使用时很可能要去依赖其他的开源包,而且必须是特定的版本才可以.以往在找 ...

  6. At.js – 用于 Web 应用程序的自动完成库

    At.js 是一个自动完成库,用来实现自动完成提示,表情等,就像你在 Github 或 Twitter 上看到的一样.它支持 HTML5 contentEditable 元素.你可以听任何字符,而不仅 ...

  7. paip. 解决java程序不能自动退出

    paip. 解决java程序不能自动退出 原因:有东西在运行,所以,不能自动退出.. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址: ...

  8. WPF 设置程序开机自动运行(+注册表项)

    #region 设置程序开机自动运行(+注册表项) RegistryKey rgkRun = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Micr ...

  9. 使用Inno Setup 打包.NET程序,并自动安装.Net Framework

    使用Inno Setup 打包.NET程序,并自动安装.Net Framework http://www.cnblogs.com/xiaogangqq123/archive/2012/03/19/24 ...

随机推荐

  1. React 读书笔记

    序言: 领导安排部门同事本月内看一本跟自己职业相关的书籍, 根基类的书籍已经看过了,重复阅读的意义不大,所以我平时看的都是视频,也许是视频作者没有出书的条件,也许是现在出书看的人越来越少了,也许有其他 ...

  2. Js实现京东无延迟菜单效果(demo)

    一个端午节,外面人山人海,又那么热,我认为宅在家里看看慕课网,充实自己来的实际... 这是一个js实现京东无延迟菜单效果,感觉很好,分享给大家... 1.开发基本的菜单结构 2.开发普通的二级菜单效果 ...

  3. Python教程(2.5)——控制台输入

    写Python程序时,你可能希望用户与程序有所交互.例如你可能希望用户输入一些信息,这样就可以让程序的扩展性提高. 这一节我们来谈一谈Python的控制台输入. 输入字符串 Python提供一个叫做i ...

  4. Python教程(2.6)——list和tuple简介

    Python中内置的类型有list和tuple. List list类似于C/C++的数组,可以存储多个数字.例如你可能会需要存储一个班里所有人的名字.这时就可以用到list.list中存储的数据叫做 ...

  5. NLTK学习笔记(一):语言处理和Python

    目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...

  6. 使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)

    前言: 本文基于jedis 2.9.0.jar.commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis连接池需要依赖commons-pool2包,json ...

  7. kali高速更新源以及主题修改方法

    文章不小心删了~这是我以前写的文章了了.实用性较强,所以现在补回来! 安装完kali之后,需要对软件进行一次整体更新:apt-get update & apt-get upgrade 但是,先 ...

  8. 导入网页数据到 Google Sheet

    数据没有用,我们需要的是数据所反映出来的东西.增长率,排名,占比等.而这些结果是通过分析数据得到的. 从网上搜集到数据后,导入到表格程序中便可以进行方便地分析处理了.下面介绍将网页中的表格数据导入到 ...

  9. 关于jQuery表单下拉selected设置无效的解决方案

    表单下拉选项使用selected设置,发现第一次默认选中成功,在页面不刷新的情况下,再次下拉,selected属性设置了,默认选中不生效 研究发现是浏览器兼容的问题 一,解决浏览器缓存问题,在HTML ...

  10. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...