原文连接:http://targetliu.com/2017/5/2…
好久没有发过文章了 – -||,今天发一篇golang
中goroutine
相关的学习笔记吧,以示例为主。
WaitGroup
WaitGroup
在 sync
包中,用于阻塞主线程执行直到添加的 goroutine
全部执行完毕。
Context
Context
是在 Go1.7
中移入标准库的。
Context
包不仅实现了在程序单元之间共享状态变量的方法,同时能通过简单的方法,使我们在被调用程序单元的外部,通过设置ctx变量值,将过期或撤销这些信号传递给被调用的程序单元。
goroutine的定时器及超时
这是两个有趣又实用的功能,在标准库 time
包里提供。
示例
源码
<!–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