使用 golang 频道。获得 "all goroutines are asleep - deadlock!"
using golang channels. GETTING "all goroutines are asleep - deadlock!"
我目前正在研究围棋例程、频道和 sync.WaitGroup。我知道 waitgroup 用于根据天气等待所有 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() 等待到 return 的路由?然后,关闭通道。之后,将通道发送到recievestuff方法输出切片中的值?但它不起作用。我尝试在循环之后将 close() 方法移动到 go 例程中,因为我认为我可能一直在尝试关闭 main() 中的错误例程。到目前为止,我发现这些东西相对令人困惑,来自 java 和 c#。任何帮助表示赞赏。
在 wg.Done()
被调用一次之前,对 wg.Wait()
的调用不会 return。
在 addStuff()
中,当没有其他 goroutine 耗尽这些值时,您将值写入通道。由于通道是无缓冲的,第一次调用 channel <- val
会永远阻塞,导致死锁。
此外,addStuff()
中的通道保持为 nil,因为您正在 main 中创建一个新的变量绑定,而不是分配给包级变量。写入 nil
通道永远阻塞:
channel := make(chan int) //doesn't affect the package-level variable
这是一个修改后的示例,它通过消耗通道中的所有值来运行完成:
我目前正在研究围棋例程、频道和 sync.WaitGroup。我知道 waitgroup 用于根据天气等待所有 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() 等待到 return 的路由?然后,关闭通道。之后,将通道发送到recievestuff方法输出切片中的值?但它不起作用。我尝试在循环之后将 close() 方法移动到 go 例程中,因为我认为我可能一直在尝试关闭 main() 中的错误例程。到目前为止,我发现这些东西相对令人困惑,来自 java 和 c#。任何帮助表示赞赏。
在 wg.Done()
被调用一次之前,对 wg.Wait()
的调用不会 return。
在 addStuff()
中,当没有其他 goroutine 耗尽这些值时,您将值写入通道。由于通道是无缓冲的,第一次调用 channel <- val
会永远阻塞,导致死锁。
此外,addStuff()
中的通道保持为 nil,因为您正在 main 中创建一个新的变量绑定,而不是分配给包级变量。写入 nil
通道永远阻塞:
channel := make(chan int) //doesn't affect the package-level variable
这是一个修改后的示例,它通过消耗通道中的所有值来运行完成: