Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/crystal-reports/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
goroutines在使用通道时死锁_Go_Parallel Processing_Goroutine - Fatal编程技术网

goroutines在使用通道时死锁

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

我是go lang的新手,我正在尝试编写一个使用goroutines的简单递归算法。我正在使用通道从goroutine接收输出,但当我尝试这样做时,我收到“致命错误:所有goroutine都处于睡眠状态-死锁!”错误。如果我注释掉频道代码,一切都会正常运行。 这是我的代码:

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。