golang多协程序并发写入问题求教

代码如下:

func index_before5() string {
    var wait = sync.WaitGroup{}
    wait.Add(1)
    infoback := make(chan gmap.StrAnyMap, 1)
    for i := 0; i < 50; i++ {
        go random_before(infoback, &wait)
    }
    wait.Wait()
    close(infoback)
 
    back := ""
 
    for v := range infoback {
        back := v
    }
    return back   
}
func random_before(info chan gmap.StrAnyMap, w *sync.WaitGroup) {
    defer w.Done()
    theadid := gconv.String(util.GOID())
    glog.Info("before 开启协程:" + theadid)
    i:=randomutil.val()
 
    info <- "返回信息"+i
 }

问题描述:
index_before5()方法里,会启动50个协程。但是wait设置有一个完成就结束,并关闭infoback。
如果主线程就执行index_before5(),程序没有问题,可以达到想象效果,也不报错。
但是,如果把index_before5() 在主线程调用两次,想象效果:两次各自输出一个back即可。可是现在,程序报错:

panic: send on closed channel
    panic: sync: negative WaitGroup counter

我的感觉是,第二个index_before5()导致,第一个里面生成的协程有人还继续在写入,就瞬间报错结束了。
求大佬指点,我应该怎么改,达到想象的效果。 index_before5()如何写,保障,有任何一个协程完成任务,其他协程要结束?

阅读 212
评论 更新于 3月26日
    1 个回答

    在random_before里判断chan吧

    评论 赞赏 3月26日