gpt4 book ai didi

go - channel 未缓冲时出现 fatal error : all goroutines are asleep - deadlock!

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:12 41 4
gpt4 key购买 nike

我试图理解我在 channel 未缓冲时遇到的错误:

"fatal error: all goroutines are asleep - deadlock!"

package main

import "fmt"

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

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

最佳答案

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

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

语句执行期间 ch <- 1 ,同时没有进程正在运行以从 channel 检索数据 ch .因为 channel 类型是非缓冲 channel ,所以发送和检索过程需要在同一时间发生。

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

go func () {
ch <- 1
}()

gg := <-ch

工作 field :https://play.golang.org/p/ceIoVQLItNk


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

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

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

Output: no panic

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

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

Output: fatal error: all goroutines are asleep - deadlock!


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

关于go - channel 未缓冲时出现 fatal error : all goroutines are asleep - deadlock!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462837/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com