package main
import (
"fmt"
"time"
)
func main() {
go func() {
time.Sleep(5 * time.Second)
fmt.Println("任务在5秒后执行,使用time.Sleep")
}()
<-time.After(5 * time.Second)
fmt.Println("任务在5秒后执行,使用time.After")
}
time.Sleep
和time.After
在这种场景下的使用方式及区别
time.Sleep
:
- 使用方式:在协程中调用
time.Sleep(duration)
,它会阻塞当前协程指定的时间。在上述代码中,time.Sleep(5 * time.Second)
会使启动的匿名协程阻塞5秒,5秒后继续执行协程内后续的代码,即打印信息。
- 缺点:它会阻塞当前协程,若在主协程中使用
time.Sleep
,会导致整个程序阻塞,直到睡眠结束。如果有其他需要并行执行的任务,可能会影响程序的响应性。
time.After
:
- 使用方式:
time.After(duration)
返回一个只写的<-chan time.Time
通道,在指定的时间后,该通道会接收到当前时间。通过<-time.After(5 * time.Second)
,主协程会阻塞在这个通道操作上,直到5秒后通道接收到数据,然后继续执行后续代码。
- 优点:相比
time.Sleep
,它更适合用于在不阻塞整个程序的情况下等待一段时间。在主协程中使用time.After
不会影响其他协程的并发执行,能更好地实现异步等待的场景。