美文网首页Go知识库
go多任务(协程)超时管理

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

作者: 波涛澎湃 | 来源:发表于2019-03-15 20:17 被阅读1次

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

        本文链接:https://www.haomeiwen.com/subject/qftdmqtx.html