如何解决在自动收报机内使用睡眠
package main
import (
"log"
"time"
)
func main() {
per := 10
period := time.Duration(per) * time.Second
log.Printf("period : %d sec\n\n",per)
ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))
for {
curTime := <-ticker.C
log.Printf("started %s",curTime.Format("2 15:04:05"))
time.Sleep(5 * time.Second)
log.Printf("ended %s\n\n",curTime.Format("2 15:04:05"))
}
}
当我在自动收报机内使用 time.Sleep 时,自动收报机停止正常工作,我希望该自动收报机每 10 秒启动一次,但我看到的结果如屏幕截图所示。我怎样才能正确地做到这一点? enter image description here
解决方法
您的代码正在运行,但您打印的时间错误。
for {
curTime := <-ticker.C
log.Printf("started %s",curTime.Format("2 15:04:05"))
time.Sleep(5 * time.Second)
log.Printf("ended %s\n\n",curTime.Format("2 15:04:05"))
}
curTime
是刻度的时间,所以这会打印两次相同的时间。相反,您应该使用 time.Now()
来获取当前时间。
for {
tickTime := <-ticker.C
log.Printf("tick %s",tickTime.Format("2 15:04:05"))
time.Sleep(5 * time.Second)
log.Printf("after sleep %s\n\n",time.Now().Format("2 15:04:05"))
}
而且,由于 NewTicker 需要 Duration,因此可以简化。
per := 10
period := time.Duration(per) * time.Second
// Rather than printing the number in `per` and assuming it's
// seconds,print the duration which can format itself.
log.Printf("period : %s\n\n",period)
// NewTicker takes a Duration which we already have.
ticker := time.NewTicker(period)
然后您在 10 秒内获得正确的 5 秒睡眠时间。
2021/03/25 16:02:49 period : 10 sec
2021/03/25 16:02:59 tick 25 16:02:59
2021/03/25 16:03:04 after sleep 25 16:03:04
2021/03/25 16:03:09 tick 25 16:03:09
2021/03/25 16:03:14 after sleep 25 16:03:14
,
替换
ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))
与
ticker := time.NewTicker(period)
看看是否有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。