代码拉取完成,页面将自动刷新
package comag
import (
v1log "gitee.com/scottq/go-framework/src/v1/log"
"math"
"time"
)
type CtlRater struct {
StopNotifyWorker
Do func()
Rate int64
v1log.InvokeLog
ch chan int
}
func (ctl *CtlRater) Start() {
defer ctl.Info("do by rate stopped")
if ctl.ch == nil {
ctl.ch = make(chan int, 64)
}
if ctl.Rate <= 0 {
ctl.Rate = 1
}
go ctl.ctlRate()
ctl.start()
}
func (ctl *CtlRater) start() {
ctl.Info("ctl rate start work")
do := ctl.Do
for {
select {
case num, ok := <-ctl.ch:
if !ok {
return
}
if num <= 0 {
continue
}
if do != nil {
for i := 1; i <= num; i++ {
do()
}
}
ctl.Info("do success %d, func is %t", num, do != nil)
case <-ctl.StopNotify():
return
}
}
}
func (ctl *CtlRater) ctlRate() {
interval := time.Millisecond * 100 //单次执行间隔
ti := time.NewTicker(interval)
add := float64(ctl.Rate) / float64(time.Second/interval) //每次间隔增加的值
var x float64 = 0
ctl.Debug("ctl rate will do every %s, every %.3f", interval, add)
for {
select {
case <-ti.C:
num := math.Floor(x + add)
x = x + add - num
ctl.ch <- int(num)
case <-ctl.StopNotify():
return
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。