空default定义导致for-select占用100%CPU,如何解决?
解决Go代码CPU 100%占用的问题
问题原因
你这段代码里的ch是未初始化的nil通道,加上select里的default分支,导致循环无休无止空转:每次select都会立刻进入default分支,没有任何阻塞逻辑,CPU被循环持续占用,直接拉满到100%。
解决方法
方法1:移除default分支(推荐)
如果你的逻辑就是等待通道接收信号后退出,直接去掉default分支即可。此时select会一直阻塞在<-ch操作上(nil通道的接收操作永久阻塞),goroutine进入休眠状态,不会消耗CPU资源:
var ch chan int for { select { case <-ch: return } }
后续只要在其他地方初始化ch并发送数据,就能触发退出逻辑。
方法2:添加休眠逻辑(需保留default时用)
如果必须保留default分支(比如需要在等待间隙执行轻量任务),可以在default里加入短暂睡眠,降低循环频率,让CPU获得空闲时间:
import "time" var ch chan int for { select { case <-ch: return default: // 每次循环休眠10毫秒,可根据需求调整时长 time.Sleep(10 * time.Millisecond) } }
方法3:用Context管理退出(更优雅的现代写法)
实际业务场景中,推荐用context.Context管理退出信号,替代裸通道的方式,代码可读性和扩展性更好:
import "context" func waitForExit(ctx context.Context) { select { case <-ctx.Done(): return } }
调用时传入带取消功能的Context(比如context.WithCancel创建的实例),即可通过取消Context触发退出。
内容的提问来源于stack exchange,提问作者Jamsen
相关产品推荐
相关产品推荐

