繁体   English   中英

基本的Golang流(通道)死锁

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM