goroutines在使用通道时死锁
我是go lang的新手,我正在尝试编写一个使用goroutines的简单递归算法。我正在使用通道从goroutine接收输出,但当我尝试这样做时,我收到“致命错误:所有goroutine都处于睡眠状态-死锁!”错误。如果我注释掉频道代码,一切都会正常运行。 这是我的代码:goroutines在使用通道时死锁,go,parallel-processing,goroutine,Go,Parallel Processing,Goroutine,我是go lang的新手,我正在尝试编写一个使用goroutines的简单递归算法。我正在使用通道从goroutine接收输出,但当我尝试这样做时,我收到“致命错误:所有goroutine都处于睡眠状态-死锁!”错误。如果我注释掉频道代码,一切都会正常运行。 这是我的代码: package main import ( "fmt" "sync" ) func main() { numbers := []int{2, -1, 10, 4, 3, 6, 22} c
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
}
主程序包
进口(
“fmt”
“同步”
)
func main(){
数字:=[]整数{2,-1,10,4,3,6,22}
ch:=make(chan[]int)
wg:=&sync.WaitGroup{}
工作组.添加(1)
go testFunc(数字、通道、工作组)
wg.Wait()
结果:=只有当发送方和接收方都准备就绪时,在无缓冲信道ch
上的通信才会成功
主函数在接收值之前等待等待组。goroutine在调用wg.Done之前尝试在通道上发送。这是一个死锁
一种修复方法是使用缓冲通道:
ch := make(chan []int, 1)
另一个修复方法是在调用wg.Wait()之前在通道上接收
result:=只有当发送方和接收方都准备就绪时,无缓冲信道ch
上的通信才会成功
主函数在接收值之前等待等待组。goroutine在调用wg.Done之前尝试在通道上发送。这是一个死锁
一种修复方法是使用缓冲通道:
ch := make(chan []int, 1)
另一个修复方法是在调用wg.Wait()之前在通道上接收
result:=在从频道接收之前,您正在等待goroutine。此处有一个未缓冲的频道,因此您不需要等待组,也不需要goroutine。在从频道接收之前,您正在等待goroutine。此处有一个未缓冲的频道,因此您不需要等待组,也不需要等待组e goroutine。缓冲通道解决了我的问题。我应该如何更改当前代码而不使用缓冲通道?另一个修复方法是在调用wg.Wait()之前在通道上接收。在这种情况下(至少在本例中),您不需要等待组-您不能在(无缓冲)上接收直到函数发送,这是它返回之前做的最后一件事。如果我要调用main中的两个TestFunc go例程,我不需要waitGroup吗?注释适用于此特定示例。如果您从两个goroutine接收到值,则可能没有理由使用goroutine。缓冲通道解决了我的问题。我如何是否要更改我的当前代码而不使用缓冲通道?另一个修复方法是在调用wg.Wait()之前在通道上接收。在这种情况下(至少在本例中),您不需要等待组-您不能在(无缓冲)通道上接收直到函数发送,这是它返回之前做的最后一件事。如果我要调用main中的两个TestFunc go例程,我不需要waitGroup吗?注释适用于此特定示例。如果您从两个goroutine接收到值,那么可能没有理由使用goroutine。