我目前正在研究 go routines、channels 和 sync.WaitGroup。我知道 waitgroup 用于根据天气等待所有 go 例程完成 wg.Done() 已被调用足够多次以减少 wg.Add() 中设置的值。 我写了一小段代码来尝试在 golang Playground 上测试这个。显示如下
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()?然后,关闭 channel 。之后,将 channel 发送到recievestuff方法输出 slice 中的值?但它不起作用。我尝试在循环之后将 close() 方法移动到 go 例程中,因为我认为我可能一直在尝试关闭 main() 中的错误例程。到目前为止,我发现这些东西相对困惑,来自 java 和 c#。任何帮助表示赞赏。
最佳答案
调用wg.Wait()
直到 wg.Done()
才会回来已调用一次。
在addStuff()
,当没有其他 goroutine 耗尽这些值时,您正在将值写入 channel 。由于 channel 是无缓冲的,第一次调用 channel <- val
会永远阻塞,导致死锁。
此外,addStuff()
中的 channel 保持为零,因为您正在 main 中创建一个新的变量绑定(bind),而不是分配给包级变量。写入 nil
channel 永远阻塞:
channel := make(chan int) //doesn't affect the package-level variable
这是一个修改后的示例,它通过消耗 channel 中的所有值来运行完成:
关于go - 使用 golang channel 。获取 "all goroutines are asleep - deadlock!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576130/