V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
? http://golang.org/
? Go Playground
Go Projects
? Revel Web Framework
insert000
V2EX  ?  Go 编程语言

请教一个循环创建 goroutine 的输出卡住问题

  •  
  •   insert000 · 2020-04-26 16:14:30 +08:00 · 1313 次点击
    这是一个创建于 1470 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    示例代码

    func main() {
    	res := make(chan int, 3)
    	for i := 0; i < 3; i++ {
    		go func(num int) {
    			res <- num
    		}(i)
    	}
    
    	for v := range res {
    		fmt.Println(v)
    	}
    	defer close(res)
    	fmt.Println("main end")
    }
    
    

    示例代码会输出

    0
    1
    2
    fatal error: all goroutines are asleep - deadlock!  //线程睡死了。。
    

    //希望得到输出

    0
    1
    2
    main end  //主线程输出
    

    这个问题怎么解决,刚学习 channel goroutines 组合使用

    第 1 条附言  ·  2020-04-26 17:31:29 +08:00

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    自己搞定了

    func main() {
    	res := make(chan int, 3)
    	var wg sync.WaitGroup
    
    	for i := 0; i < 3; i++ {
    		wg.Add(1)
    		go func(n int) {
    			defer wg.Done()
    			res <- n
    
    		}(i)
    	}
    	wg.Wait()
    	close(res)
    
    	for v := range res{
    		fmt.Println(v)
    	}
    	fmt.Println("main is end")
    
    }
    
    
    3 条回复  ?  2020-04-28 11:59:45 +08:00
    yiplee
        1
    yiplee  
       2020-04-28 10:19:38 +08:00
    deadlock 的原因是

    ```golang
    for v := range res {
    fmt.Println(v)
    }
    ```

    这里在一直消费 res,消费了三次之后消费完了就一直等待了,程序卡死在这。
    insert000
        2
    insert000  
    OP
       2020-04-28 10:52:23 +08:00
    @yiplee 怎么能判断消费完了,退出呢?
    yiplee
        3
    yiplee  
       2020-04-28 11:59:45 +08:00
    @insert000 #2 是否消费完,得看生产那边什么时候 close 。消费这边也可以加一个超时,多长时间没来新得就不等了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2737 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:31 · PVG 22:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com