代码如下:
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()如何写,保障,有任何一个协程完成任务,其他协程要结束?
在random_before里判断chan吧