问题:开启多个协程,只有当所有协程全部返回后,才能继续执行主逻辑代码;同时添加超时功能,当到达设置的超时时间仍有协程未返回则直接输出错误。
解决方案:
使用两层协程,第一层开启一个协程管理所有的子协程任务,当所有子协程任务全部成功后通知主协程继续;
超时使用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)
}