[英]A basic Golang stream(channel) deadlock
我正在尝试使用go stream,但有几个“愚蠢”的问题。
我已经用字节限制范围做了一个原始的流示例,这是工作代码,这是我的问题。
1-为什么此代码在新行显示1和2? 为什么它没有一次显示12? 是否从字节限制的流中删除了字节的第一和平? (但是,当我们已经将1数字推入时,如何将2数字推入流中?)我只是不明白
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}
It shows:
1
2
2个问题-我尝试使用此代码来了解其工作原理,并且删除了字节范围,并遇到了死锁错误。 为什么会发生? 谢谢!
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/tmp/sandbox557775903/main.go:7 +0x60
死锁错误代码:
package main
import "fmt"
func main() {
ch := make(chan int)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}
谢谢你的帮助! 对不起原始问题。
因为通道运算符<-
仅占用通道中的1个元素。 如果希望它们一起打印,请尝试: fmt.Println("%v%v", <-c, <-c)"
通道创建中的最后一个数字make(chan int, 2)
表示通道缓冲区-它存储项目的能力。 因此,您可以轻松地将2个项目推送到频道。 但是,如果您尝试再推一件商品,会发生什么? 该操作将被阻止,因为在从通道读取另一个goroutine并释放空间之前,没有空间。
同样适用于所有通道-未缓冲的通道会在首次写入元素时被阻塞。 直到从该通道读取某些goroutine。
因为没有要读取的goroutine,所以要永远写一个锁。 您可以在开始阅读goroutine之前解决该问题。
c := make(chan int)
go func () {
fmt.Println(<-c)
fmt.Println(<-c)
}()
ch <- 1
ch <- 2
这种方式不会被锁定,而是开始传输项目。
1-为什么此代码在新行显示1和2?
答:因为您使用Println()方法。 如果您希望将它们放在一行上,请使用Print()
2我尝试使用此代码来了解其工作原理,并且删除了字节字数,并出现了死锁错误。 为什么会发生?
就代码所示而言,您永远不会为您创建的频道启动并发阅读器。 因为它是无缓冲的,所以对它的任何写操作都将阻塞,直到有人从另一端读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.