Go-Select多路复用机制的面试真题与底层实现
Go-Select多路复用机制的面试真题与底层实现
文章导语
select是Go并发编程中的高级特性。面试官常常通过select考察候选人对Go并发模型的深度理解。本文覆盖select的底层原理和经典面试题。
一、select的随机性原理
funcselectgo(cas0*scase,order0*uint16,ncasesint)(int,bool){// 1. 随机打乱pollorderfori:=rangepollorder{j:=fastrandn(uint32(i+1))pollorder[i],pollorder[j]=pollorder[j],pollorder[i]}// 2. 按锁地址排序lockorder(防死锁)// 3. 检查可执行case// 4. 全部不可执行→阻塞}二、面试真题
Q: select中多个case同时就绪,选哪个?
A: 随机选择,防止case饿死。
Q: select{}和for{}的区别?
A: select{}永久阻塞无CPU消耗,for{}死循环占满CPU。
Q: nil channel在select中的行为?
A: 被忽略,可用于动态禁用case。
三、全文总结
select随机执行就绪case,nil channel在select中被忽略,default实现非阻塞操作,lockorder排序防止死锁。
参考文献
- Go源码 runtime/select.go
- Go Blog - Go Concurrency Patterns