Golang中WaitGroup、Context、goroutine定时器及超时学习笔记
发布时间:2020-12-16 18:13:42 所属栏目:大数据 来源:网络整理
导读:原文连接:http://targetliu.com/2017/5/2... 好久没有发过文章了 - -||,今天发一篇 golang 中 goroutine 相关的学习笔记吧,以示例为主。 WaitGroup WaitGroup 在 sync 包中,用于阻塞主线程执行直到添加的 goroutine 全部执行完毕。 Context Context 是在
WaitGroup
Context
goroutine的定时器及超时这是两个有趣又实用的功能,在标准库 示例源码<!--more--> package main import ( "context" "fmt" "sync" "time" ) func main() { ch := make(chan int) //定义一个WaitGroup,阻塞主线程执行 var wg sync.WaitGroup //添加一个goroutine等待 wg.Add(1) //goroutine超时 go func() { //执行完成,减少一个goroutine等待 defer wg.Done() for { select { case i := <-ch: fmt.Println(i) //goroutine内部3秒超时 case <-time.After(3 * time.Second): fmt.Println("goroutine1 timed out") return } } }() ch <- 1 //新增一个1秒执行一次的计时器 ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() //新增一个10秒超时的上下文 background := context.Background() ctx,_ := context.WithTimeout(background,10*time.Second) //添加一个goroutine等待 wg.Add(1) go func(ctx context.Context) { //执行完成,减少一个goroutine等待 defer wg.Done() for { select { //每秒一次 case <-ticker.C: fmt.Println("tick") //内部超时,不会被执行 case <-time.After(5 * time.Second): fmt.Println("goroutine2 timed out") //上下文传递超时信息,结束goroutine case <-ctx.Done(): fmt.Println("goroutine2 done") return } } }(ctx) //等待所有goroutine执行完成 wg.Wait() } 执行结果1 tick tick tick goroutine1 timed out tick tick tick tick tick tick tick goroutine2 done (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |