
在Go语言中,缓冲通道是一种特殊类型的通道,它与普通通道的行为有所不同。普通通道在发送数据时,发送者会被阻塞,直到有接收者接收数据为止。而缓冲通道则允许发送者在通道未满时继续发送数据,而不会被阻塞。这样一来,发送者可以更快地完成发送操作,而不需要等待接收者。对于Go语言的使用者来说,缓冲通道的行为可以提供更高的并发性能和更好的响应速度。
我试图了解缓冲通道的工作原理并为其编写代码片段
package main
import (
"fmt"
)
func squares(c chan int) {
for i := 0; i < 4; i++ {
num := <-c
fmt.println(num * num)
}
}
func main() {
fmt.println("main() started")
c := make(chan int, 3)
go squares(c)
c <- 1
c <- 2
c <- 3
c <- 4 // blocks here
fmt.println("main() stopped")
}按照我预期程序的行为方式,主 goroutine 启动并持续到 c<-4,此时它被阻塞,控制权转到 square goroutine(因为缓冲区容量为 3)。 squares goroutine 中的循环一直持续到第四次迭代,此时通道为空。空通道上的读取操作会被阻塞,因此控制权会返回到主 goroutine。此时,对通道(c<-4)的写入操作被执行,我们打印“main()已停止”,程序结束。
意思是我期望的输出是,
main() started 1 4 9 main() stopped
但是我得到了输出,
main() started 1 4 9 16 main() stopped
渠道不是这样运作的。
Goroutines 并发运行。这意味着当一个 Goroutine 发送到缓冲通道时,另一个等待从该通道接收的 Goroutine 可以立即接收它。它不会等待通道填满。
至于程序的结束,当你将最后一个数字发送到通道时,不能保证 goroutine 会在程序结束之前拾取它并打印输出,因为你没有等待 goroutine完全的。因此,幸运的是,它运行并打印输出。还会有其他执行不会发生这种情况,并且程序会在 goroutine 打印输出之前终止。
以上就是缓冲通道的行为与我对 Go 的期望有何不同?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号