iam当前正在使用go例程,频道和sync.WaitGroup。我知道waitgroup用于根据天气wg等待所有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()吗?然后,关闭通道。之后,将通道发送到recievestuff方法以输出 slice 中的值吗?但它不起作用。我也尝试在循环后在go例程中移动close()方法,因为我认为我可能一直试图在main()中关闭错误的例程。香港专业教育学院发现到目前为止,这些东西相对混乱来自Java和C#。任何帮助表示赞赏。

最佳答案

直到调用wg.Wait()一次,对wg.Done()的调用才会返回。

addStuff()中,当没有其他goroutine消耗这些值时,您正在将值写入通道。由于通道是无缓冲的,因此对channel <- val的首次调用将永远被阻塞,从而导致死锁。

此外,由于您是在main内部创建新的变量绑定,而不是分配给程序包级变量,因此addStuff()中的通道仍然为零。写入nil通道将永远阻止:
channel := make(chan int) //doesn't affect the package-level variable
这是一个修改后的示例,通过使用通道中的所有值来运行完成:

https://play.golang.org/p/6gcyDWxov7

关于go - 使用golang channel 。得到“所有goroutine都在 sleep —死锁!”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39576130/

10-10 04:32