Go语言chan最多可阻塞多少个写操作 数量是否由内存大小决定?
Go 通道阻塞写 goroutine 数量上限说明
核心结论
- Go 语言 runtime 层没有对单个通道的
sendq阻塞队列设置固定的长度上限,理论上可阻塞的写 goroutine 数量仅受进程可用内存大小限制。
具体原理
你提到的通道内部的 sendq 是存储阻塞写 goroutine 的双向链表,每个被阻塞的写 goroutine 会被封装为 sudog 结构体节点插入该链表:
- 该链表没有预设的最大长度阈值,只要内存资源充足,就可以持续追加新的阻塞节点
- 单个 goroutine 的初始栈内存仅为 2KB(不同版本可能有微调),加上
sudog结构体的几十字节开销,每阻塞一个写 goroutine 的内存占用极低,常规配置下可以轻松支持几万甚至几十万的阻塞写 goroutine - 只有当 Go 进程可申请的系统内存耗尽时,才会无法创建新的 goroutine,也就无法再产生新的阻塞写 goroutine
补充说明:无缓冲通道的写操作从调用开始就会进入阻塞,和有缓冲通道写满后的阻塞逻辑完全一致,可阻塞的 goroutine 上限同样仅受内存限制。
内容的提问来源于stack exchange,提问作者Yongqi Z
相关产品推荐
相关产品推荐

