使用通道时 goroutines 死锁
goroutines deadlock when using channels
我是 go lang 的新手,我正在尝试编写一个使用 goroutine 的简单递归算法。我正在使用通道从 goroutine 接收输出,但是当我尝试这样做时,我收到 "fatal error: all goroutines are asleep - deadlock!" 错误。如果我注释掉频道代码,一切都运行良好。
这是我的代码:
package main
import (
"fmt"
"sync"
)
func main() {
numbers := []int{2, -1, 10, 4, 3, 6, 22}
ch := make(chan []int)
wg := &sync.WaitGroup{}
wg.Add(1)
go testFunc(numbers, ch, wg)
wg.Wait()
result := <-ch
fmt.Println("Result: ", result)
}
func testFunc(numbers []int, ch chan []int, wg *sync.WaitGroup) {
defer wg.Done()
ch <- numbers
}
我做错了什么?我正在为 goroutine 中的通道分配值并在 main 中读取它。交流还不够吗?
仅当发送方和接收方都准备就绪时,无缓冲通道ch
上的通信才会成功。
主函数在接收值之前在等待组上等待。 goroutine 尝试在调用 wg.Done 之前在通道上发送。这是一个僵局。
一种解决方法是使用缓冲通道:
ch := make(chan []int, 1)
另一个修复方法是在调用 wg.Wait() 之前在频道上接收。
result := <-ch
wg.Wait()
还有一个修复方法是使用等待组删除所有行。在这个具体的例子中不需要它。
我是 go lang 的新手,我正在尝试编写一个使用 goroutine 的简单递归算法。我正在使用通道从 goroutine 接收输出,但是当我尝试这样做时,我收到 "fatal error: all goroutines are asleep - deadlock!" 错误。如果我注释掉频道代码,一切都运行良好。 这是我的代码:
package main
import (
"fmt"
"sync"
)
func main() {
numbers := []int{2, -1, 10, 4, 3, 6, 22}
ch := make(chan []int)
wg := &sync.WaitGroup{}
wg.Add(1)
go testFunc(numbers, ch, wg)
wg.Wait()
result := <-ch
fmt.Println("Result: ", result)
}
func testFunc(numbers []int, ch chan []int, wg *sync.WaitGroup) {
defer wg.Done()
ch <- numbers
}
我做错了什么?我正在为 goroutine 中的通道分配值并在 main 中读取它。交流还不够吗?
仅当发送方和接收方都准备就绪时,无缓冲通道ch
上的通信才会成功。
主函数在接收值之前在等待组上等待。 goroutine 尝试在调用 wg.Done 之前在通道上发送。这是一个僵局。
一种解决方法是使用缓冲通道:
ch := make(chan []int, 1)
另一个修复方法是在调用 wg.Wait() 之前在频道上接收。
result := <-ch
wg.Wait()
还有一个修复方法是使用等待组删除所有行。在这个具体的例子中不需要它。