go多任务(协程)超时管理

问题:开启多个协程,只有当所有协程全部返回后,才能继续执行主逻辑代码;同时添加超时功能,当到达设置的超时时间仍有协程未返回则直接输出错误。
解决方案:
使用两层协程,第一层开启一个协程管理所有的子协程任务,当所有子协程任务全部成功后通知主协程继续;
超时使用context包下的withtimeout 或者time.after。代码如下:


import (
    "fmt"
    "sync"
    "time"
)

var(
    sum int
    lock = sync.Mutex{}
    c = make(chan bool)
)

func main(){
    wg :=sync.WaitGroup{}
    go func(){
        funcSecond(&wg)
    }()
    select {
    case <-time.After(time.Second*11):
        fmt.Println("time out!")
    case <-c:
        fmt.Println("succ, sum should be equal 55,  sum=",sum)
    }
}
func funcSecond(wg *sync.WaitGroup){
    for i:=1;i<=10;i++{
        wg.Add(1)
        go foo(wg,i)
    }
    wg.Wait()
    c<-true
}
func foo(wg *sync.WaitGroup,j int){
    defer wg.Done()
    lock.Lock()
    defer lock.Unlock()
    sum=sum+j
    time.Sleep(time.Microsecond*10)
}

你可能感兴趣的:(go多任务(协程)超时管理)