iam当前正在使用go例程,频道和sync.WaitGroup。我知道waitgroup用于根据天气wg等待所有go例程完成。wg.Done()已被调用足够的时间以降低wg.Add()中设置的值。
我写了一些代码来尝试在golang游乐场进行测试。显示如下
var channel chan int
var wg sync.WaitGroup
func main() {
channel := make(chan int)
mynums := []int{1,2,3,4,5,6,7,8,9}
wg.Add(1)
go addStuff(mynums)
wg.Wait()
close(channel)
recieveStuff(channel)
}
func addStuff(mynums []int) {
for _, val := range mynums {
channel <- val
}
wg.Done()
}
func recieveStuff(channel chan int) {
for val := range channel{
fmt.Println(val)
}
}
我收到一个死锁错误。我试图等待路由返回与wg.Wait()吗?然后,关闭通道。之后,将通道发送到recievestuff方法以输出 slice 中的值吗?但它不起作用。我也尝试在循环后在go例程中移动close()方法,因为我认为我可能一直试图在main()中关闭错误的例程。香港专业教育学院发现到目前为止,这些东西相对混乱来自Java和C#。任何帮助表示赞赏。
最佳答案
直到调用wg.Wait()
一次,对wg.Done()
的调用才会返回。
在addStuff()
中,当没有其他goroutine消耗这些值时,您正在将值写入通道。由于通道是无缓冲的,因此对channel <- val
的首次调用将永远被阻塞,从而导致死锁。
此外,由于您是在main内部创建新的变量绑定,而不是分配给程序包级变量,因此addStuff()
中的通道仍然为零。写入nil
通道将永远阻止:channel := make(chan int) //doesn't affect the package-level variable
这是一个修改后的示例,通过使用通道中的所有值来运行完成:
https://play.golang.org/p/6gcyDWxov7
关于go - 使用golang channel 。得到“所有goroutine都在 sleep —死锁!”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39576130/