问答

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

作者:admin 2021-09-16 我要评论

代码如下: func index_before5() string { var wait = sync.WaitGroup{} wait.Add(1) infoback := make(chan gmap.StrAnyMap, 1) for i := 0; i 50; i++ { go r...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

代码如下:

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吧

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • golang多协程序并发写入问题求教

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

  • cordova 使用 科大讯飞插件  cordova-p

    cordova 使用 科大讯飞插件 cordova-p

  • input type=file 无法调用摄像机

    input type=file 无法调用摄像机

  • 怎么让selenium启动的浏览器和本地浏览

    怎么让selenium启动的浏览器和本地浏览

腾讯云代理商
海外云服务器