使用Goroutine和time.Sleep
实现延迟任务
package main
import (
"fmt"
"time"
)
func main() {
go func() {
time.Sleep(5 * time.Second)
fmt.Println("延迟5秒后执行,使用time.Sleep")
}()
// 防止主函数退出
select {}
}
使用Goroutine和time.After
实现延迟任务
package main
import (
"fmt"
"time"
)
func main() {
go func() {
<-time.After(5 * time.Second)
fmt.Println("延迟5秒后执行,使用time.After")
}()
// 防止主函数退出
select {}
}
time.Sleep
和time.After
在这种场景下的使用区别
time.Sleep
:它会阻塞当前的Goroutine,在调用time.Sleep
的这段时间内,该Goroutine无法执行其他任务,直到睡眠时间结束。如果在主Goroutine中使用time.Sleep
,会导致整个程序暂停运行。在上述示例中,它简单直接地让所在的Goroutine暂停5秒后再执行后续打印任务。
time.After
:time.After
返回一个只接收数据的通道,它不会阻塞当前Goroutine。而是在指定的时间后,向这个通道发送一个当前时间。在示例中,通过<-time.After(5 * time.Second)
来阻塞Goroutine,直到通道接收到数据(即5秒后),才继续执行后续打印任务。这种方式相对更灵活,尤其在需要结合其他通道操作或者更复杂的并发场景时,它允许Goroutine在等待时间的同时,还可以处理其他通道的操作。