欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > golang的channel什么时候会阻塞?什么时候会恢复?

golang的channel什么时候会阻塞?什么时候会恢复?

2025/6/4 7:46:10 来源:https://blog.csdn.net/weixin_39289004/article/details/141228789  浏览:    关键词:golang的channel什么时候会阻塞?什么时候会恢复?

在 Go 语言中,channel 的发送和接收操作会根据其缓冲区的状态而阻塞或恢复。以下是详细说明:

1. 无缓冲 channel

  • 发送操作

    • 阻塞:发送数据时会阻塞,直到有另一个 goroutine 从该 channel 接收数据。
  • 接收操作

    • 阻塞:接收数据时会阻塞,直到有另一个 goroutine 向该 channel 发送数据。

2. 有缓冲 channel

  • 发送操作

    • 阻塞:当缓冲区已满时,发送操作会阻塞,直到有空间可以发送数据。
    • 恢复:当接收操作释放了空间(即接收数据),发送操作会恢复执行。
  • 接收操作

    • 阻塞:当缓冲区为空时,接收操作会阻塞,直到有数据可以接收。
    • 恢复:当发送操作添加了数据,接收操作会恢复执行。

示例代码

以下是一个示例,展示无缓冲和有缓冲 channel 的阻塞和恢复行为:

package mainimport ("fmt""time"
)func main() {// 无缓冲 channel 示例ch1 := make(chan int)go func() {ch1 <- 1 // 发送数据,阻塞直到接收fmt.Println("Sent 1")}()// 主 goroutine 等待一秒再接收time.Sleep(1 * time.Second)fmt.Println("Received:", <-ch1) // 接收数据,解除阻塞// 有缓冲 channel 示例ch2 := make(chan int, 2) // 缓冲区大小为 2ch2 <- 1 // 不会阻塞ch2 <- 2 // 也不会阻塞go func() {ch2 <- 3 // 这里会阻塞,直到有接收fmt.Println("Sent 3")}()fmt.Println("Received from buffered channel:", <-ch2) // 接收,解除阻塞fmt.Println("Received from buffered channel:", <-ch2) // 继续接收time.Sleep(1 * time.Second) // 确保 goroutine 完成
}

总结

  • 无缓冲 channel:发送和接收操作会相互阻塞,直到对方准备好。
  • 有缓冲 channel:发送操作在缓冲区未满时不会阻塞;接收操作在缓冲区为空时会阻塞。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词