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

2020-04-26 16:14:30 +08:00
 insert000

示例代码

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 组合使用

1306 次点击
所在节点    Go 编程语言
3 条回复
yiplee
2020-04-28 10:19:38 +08:00
deadlock 的原因是

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

这里在一直消费 res,消费了三次之后消费完了就一直等待了,程序卡死在这。
insert000
2020-04-28 10:52:23 +08:00
@yiplee 怎么能判断消费完了,退出呢?
yiplee
2020-04-28 11:59:45 +08:00
@insert000 #2 是否消费完,得看生产那边什么时候 close 。消费这边也可以加一个超时,多长时间没来新得就不等了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666309

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX