2 回答
TA贡献1836条经验 获得超13个赞
如果缓冲区中有空间,则写入缓冲通道不会阻塞。
如果您尝试将缓冲区大小为 1 的两个项目放入通道中,则会出现相同的错误:
package main
func main() {
c := make(chan int, 1)
c <- 3
c <- 4
}
给你:
fatal error: all goroutines are asleep - deadlock!
TA贡献1859条经验 获得超6个赞
这是 Go 通道(或其他CSP实现,如 Clojure 的core.async库)的核心概念,它们被阻塞。一般来说,正如您已经提到的,有两种类型的渠道:
如果缓冲区已满,则缓冲哪个块。
如果没有“集合点”,则无缓冲哪个块,即必须有人将 ( c <-)放入<- c频道,有人从频道中取出 ( )。
在您的特定情况下,Go 运行时足够智能,可以检测到没有人会3从 channel 中获取c。因此,这是一个死锁,并且(谢天谢地)抛出了一个错误。
当你使用通道时,你通常做的是使用goroutines(查看这个介绍),它产生一个轻量级线程——由 Go 运行时管理——来并发执行主体:
c := make(chan int)
go func() { c <- 3 }() // Create a new gorountine that puts 3 to the channel
fmt.Println(<- c) // Take 3 from the channel and print it in the main thread
- 2 回答
- 0 关注
- 194 浏览
添加回答
举报