gpt4 book ai didi

go - 使用Ticker的Goroutine选择循环导致CPU达到100%

转载 作者:行者123 更新时间:2023-12-01 21:15:43 25 4
gpt4 key购买 nike

我有一个循环,它所做的是试图反复轮询到另一台服务器。我使用代码来实现此目的,但是程序反复显示100%CPU使用率。
此行情收录器在goroutine中运行。 HTTP服务器在另一个goroutine中运行。


func() Monitor() {

abort := make(chan bool)

log.Info("Monitor started.")

// start the monitor goroutine
go func() {
defer log.Info("Stopped monitor")

ticker := time.NewTicker(time.Duration(35.0) * time.Second)
defer ticker.Stop()

log.Info("Monitor started! \n")
for {
select {
case t := <-ticker.C:
log.Infof("Subscribe to service at time %v\n", t)
if err := selfConn.SubscribeToService(); err != nil {
log.Errorf("Failed to subscribe to primary connector: %v", err)
}
case <-abort:
log.Info("Finished routine!")
return
default:
continue
}
}
}()

go func() {
time.Sleep(10 * time.Minute)
abort <- true
}()
}
但是,当监视器循环开始时,并且每次发送到股票行情 channel 的信号时,CPU都会始终显示100%。
我错过了在goroutine中使用代码来使它不会消耗100%CPU的东西?

最佳答案

您的循环中有一个带有select分支的 default 。如果没有其他case准备就绪,则default分支将立即执行,因此您的下一次迭代将立即开始,而无需等待。这是一个繁忙的循环。
另外,也不需要终止其他goroutine,可以在同一goroutine中使用计时器。
例如:

func monitor() {
log.Info("Monitor started.")

ticker := time.NewTicker(35 * time.Second)
defer ticker.Stop()

timeoutCh := time.After(10 * time.Minute)
for {
select {
case t := <-ticker.C:
log.Infof("Subscribe to service at time %v\n", t)
if err := selfConn.SubscribeToService(); err != nil {
log.Errorf("Failed to subscribe to primary connector: %v", err)
}
case <-timeoutCh:
log.Info("Finished routine!")
return
}
}
}

关于go - 使用Ticker的Goroutine选择循环导致CPU达到100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63879352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com