Golang for select default 导致CPU 100%

文章讲述了作者在Golang程序中遇到CPU占用过高的问题,发现是由于`forselect`循环中的`default`分支无阻塞执行导致。通过移除或修改default分支,解决了CPU使用率过高的问题。
摘要由CSDN通过智能技术生成

 上个星期做了一个Golang程序,放在2核CPU,4G内存的云服务器上,当时也没有观察CPU的使用情况,今天发现CPU跑满了。后面发现是我在创建一个协程的函数 default 导致的。

(1)处理前,进程的cpu占用率为100%

(2)处理后,进程的cpu占用率为0.3%

(3)代码上处理(示例)

func handle() {

	defer func() {
		if r := recover(); r != nil {
			log.Println(fmt.Sprintf("[handle] panic from %v", r))
		}
	}()

	timer := time.NewTicker(60 * time.Minute)

	for {
		select {
		case <-timer.C:
			 fmt.Println("todo ")
		 //default:        //屏蔽default,CPU 就会降下来
		}
	}
}

 原因:for select循环在没有其他阻塞操作(timer.C定时器时间未到)的情况下不断执行default分支,并且default分支中的代码没有包含任何形式的等待或休眠,导致CPU使用率过高,因为循环会不断地、非常快速地执行。

 

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值