go channel练习
2021-04-12 本文已影响0人
顶尖少爷
透过 go channel练习
- 透过goroutine 跑20个job
- 显示各个job的完成情况
- 使用errChan job发生错误跳出main func
- 通过 finishChan 通知全部job完成
- 设置超时机制
/**
* @ClassName main
* @Description //TODO
* @Author liwei
* @Date 2021/4/12 21:30
* @Version example V1.0
**/
package main
import (
"fmt"
"log"
"math/rand"
"sync"
"time"
)
func main() {
outChan:=make(chan string,100)
finishChan:=make(chan struct{})
errChan:=make(chan error,100)
wg:=sync.WaitGroup{}
wg.Add(20)
for i:=0;i<=20 ;i++ {//透过goroutine 跑20个job
go func(val int ,wg *sync.WaitGroup,out chan string,err chan error) {
time.Sleep(time.Duration(rand.Int31n(1000))*time.Millisecond)
out<-fmt.Sprintf("finish job id:%d",val)
//if val==15{
// err<-errors.New("fail job in 15")
//}
wg.Done()
}(i,&wg,outChan,errChan)
}
go func() {
wg.Wait()
close(finishChan)
}()
Loop :
for {
select {
case out:=<-outChan: //显示各个job的完成情况
log.Print(out)
case err:=<-errChan://出现错误执行
log.Print(err)
break Loop
case <-finishChan: //完成执行
log.Print("close finishChan")
break Loop
case <-time.After(100*time.Millisecond): //超时执行
log.Print("timeOut")
break Loop
}
}
}