使用频道

时间:2017-12-04 20:32:43

标签: go parallel-processing goroutine

我是lang的新手,我正在尝试编写一个使用goroutines的简单递归算法。我正在使用频道从goroutine接收输出,但是当我尝试这样做时,我收到了#34;致命错误:所有goroutines都睡着了 - 死锁!"错误。如果我注释掉频道代码一切正常。 这是我的代码:

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中读取它。那不足以沟通吗?

1 个答案:

答案 0 :(得分:4)

只有当发送方和接收方都准备就绪时,无缓冲信道ch上的通信才会成功。

主函数在接收值之前等待等待组。 goroutine尝试在调用wg.Done之前发送通道。这是一个僵局。

一种解决方法是使用缓冲通道:

     ch := make(chan []int, 1)

另一个解决方法是在调用wg.Wait()之前在频道上接收。

result := <-ch
wg.Wait()

另一个修复方法是使用等待组删除所有行。在这个具体的例子中不需要它。