【问题标题】:fatal error: all goroutines are asleep - deadlock! when channel is not buffered致命错误:所有 goroutine 都处于休眠状态 - 死锁!当通道没有缓冲时
【发布时间】:2021-06-25 21:19:48
【问题描述】:

我尝试理解通道未缓冲时出现的错误:

“致命错误:所有 goroutine 都处于休眠状态 - 死锁!”

package main

import "fmt"

func main() {
     ch := make(chan int)
     ch <- 1
     gg := <-ch 
     fmt.Println(gg)    
}

它在我缓冲频道ch := make(chan int, 2)后工作

【问题讨论】:

    标签: go


    【解决方案1】:

    通过非缓冲通道发送和检索数据都是阻塞进程。

    在您的代码中,您尝试通过通道 ch 发送数值 1。由于操作是阻塞的,所以在当前行执行完成之前,下面的代码不会被执行。

    在执行语句ch &lt;- 1 期间,同时没有运行从通道ch 检索数据的进程。因为通道类型是非缓冲通道,所以发送和检索过程需要同时发生。

    在下面的示例中,我创建了一个 goroutine,其中包含一个通过通道发送数据的代码,以及在主例程中从通道检索数据的另一个代码。这将起作用,因为 main 例程和 goroutine 进程将分别并发执行。

    go func () {
        ch <- 1
    }()
    
    gg := <-ch 
    

    工作场所:https://play.golang.org/p/ceIoVQLItNk


    还有一种叫做缓冲通道的东西。使用它,即使没有同时运行检索数据的进程,您也可以通过通道多次发送数据。但是有一个规则:你只能发送n次,而n代表缓冲区号。

    示例 1:发送数据 2 次(缓冲区设置为 3),然后检索它:

    ch := make(chan int, 3)
    ch <- 1
    ch <- 1
    gg := <-ch
    

    输出:没有恐慌

    示例 2:发送数据 4 次(缓冲区设置为 3),然后检索它:

    ch := make(chan int, 3)
    ch <- 1
    ch <- 1
    ch <- 1
    ch <- 1
    gg := <-ch
    

    输出:致命错误:所有 goroutine 都处于休眠状态 - 死锁!


    更多信息:https://blog.golang.org/pipelines

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2015-01-11
      • 2013-11-22
      • 1970-01-01
      • 2012-09-06
      • 2022-08-16
      • 2022-01-21
      相关资源
      最近更新 更多