waitGroup
var wg sync.waitGroup
_______________________________________________
wg.add(1) | wg.add(2)
wg.Done() | wg.Done()
_______________________________________________
wg.Wait()
主动通知停止
Channel +Select
for {
select {
case <- stop:
fmt.Print("got the stop channel")
return
default:
fmt.Print("still working")
time.Sleep(1 * time.Second)
}
}()
time.Sleep(5 * time.Second)
stop <- true
Context
有多个Goroutine或Goroutine内又有Goroutine
func main() {
ctx, cancel := context.WithCancel(context.Background())
for i := 1; i <= 5; i++ {
go monitor(ctx, i) //开启5个协程
}
time.sleep(time.Second)
fmt.Print("执行关闭操作")
cancel()
}
func monitor(ctx context.Context, number int){
for {
select {
case structCHan := <-ctx.Done():
fmt.Printf("监控器%v,接收到通道中的数据为:%v,监控结束\n",number,strutChan)
return
defaule:
fmt.Print("监控器%v,正在监控中!\n", number)
time.sleep(time.second)
}
}
}