Golang time.Sleep()函数及示例
介绍
time.Sleep()
是Golang中一个非常重要的函数。它可以让程序暂停一段时间,让CPU再去运行其他的任务。这个函数在网络编程、定时器和一些需要延迟执行的任务中非常有用。
格式
time.Sleep()
的函数格式如下:
func Sleep(d Duration)
其中,参数d为时间段数值,单位为纳秒。Duration是Go标准库定义的一个类型,声明如下:
type Duration int64
它代表一段时间间隔(以纳秒为单位),可以是负数或正数,可以超出int64数值类型的范围。我们可以使用常量或运算表达式创建Duration类型的变量。
示例
下面是一些使用time.Sleep()
的示例代码:
示例1:休息5秒钟
package main
import (
"fmt"
"time"
)
func main() {
start := time.Now()
fmt.Println("开始休息:", start)
time.Sleep(5 * time.Second)
end := time.Now()
fmt.Println("休息结束:", end)
fmt.Println("休息了", end.Sub(start))
}
在上面的代码中,首先使用time.Now()
获取当前时间,然后执行time.Sleep(5 * time.Second)
函数,让程序暂停5秒钟。最后,再次使用time.Now()
获取当前时间,从而计算出程序休息的时间。运行结果如下:
开始休息: 2021-08-01 15:04:47.904051 +0800 CST m=+0.000252598
休息结束: 2021-08-01 15:04:52.904587 +0800 CST m=+5.000789245
休息了 5s
代码中的time.Second
是Duration
类型的常量,代表1秒钟(1000000000纳秒)。在time.Sleep()
函数中,5 * time.Second
表示休息5秒钟。
示例2:阻塞主线程
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("开始")
time.Sleep(10)
fmt.Println("结束")
}
细心的朋友可能会发现,上面的代码中time.Sleep()
的参数没有加任何单位,原因是在Go语言中,对于无单位的时间,被默认解析为纳秒。这段代码在执行时会阻塞主线程10纳秒,即使没有其他任务,CPU也无法去执行程序的其他部分。运行结果如下:
开始
结束
代码中的10
代表10纳秒。
示例3:定时器
package main
import (
"fmt"
"time"
)
func main() {
timer1 := time.NewTimer(2 * time.Second)
<-timer1.C
fmt.Println("Timer 1 expired")
}
在上面的代码中,我们使用了time.NewTimer()
函数来创建一个定时器,它会在2秒钟后触发。然后通过读取timer1.C
的通道来等待定时器的事件到来。当定时器到时间时,程序将输出Timer 1 expired
。运行结果如下:
Timer 1 expired
示例4:周期性任务
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(500 * time.Millisecond)
done := make(chan bool)
go func() {
for {
select {
case <- done:
return
case t := <- ticker.C:
fmt.Println("Tick at ", t)
}
}
}()
time.Sleep(1600 * time.Millisecond)
ticker.Stop()
done <- true
fmt.Println("Ticker stopped")
}
在上面的代码中,我们使用time.NewTicker()
函数创建了一个定时器ticker
,它每500毫秒会触发一次,不断循环,执行定时任务。在go func()
中,我们使用了select
语句来依次监控两个管道,一个是定时器的通道ticker.C
,一个是done
管道,当done
管道中有数据时,说明任务结束,需要退出循环。而当ticker.C
管道中有数据时,说明定时器到时间了,进行周期之间的任务处理。
运行结果如下:
Tick at 2021-08-01 15:35:56.788502 +0800 CST m=+0.500065401
Tick at 2021-08-01 15:35:57.288301 +0800 CST m=+1.000865267
Tick at 2021-08-01 15:35:57.788353 +0800 CST m=+1.500916971
Ticker stopped
代码中的time.NewTicker()
函数返回的是Ticker
类型的结构体,与之前的Timer
类型类似。不同的是,Ticker
类型有一个C
通道,用于发送时间事件。在这个示例中,定时器每500毫秒会向这个通道中写入一次时间事件。而在select
语句中,我们使用了case t := <-ticker.C
来处理定时器事件,并在输出时使用了t
来表示时间戳。
结论
通过本文,我们了解了Golang中重要的函数time.Sleep()
的基本介绍、格式、用法和示例代码。我们可以使用time.Sleep()
来制定一定的延时,或者实现更高级的任务处理功能,如定时器或周期性任务等。在实际编写代码时,需要灵活运用这种函数,以确保程序的正确性和高效性。