求助 GO 语言中如何在每天的固定时间点去运行某些方法,当到这个时间点时才会运行,启动时并不会运行

共 5 个回复


zenghao306

写一个Timer时间即可,具体代码如下:
func TimerTask() {
defer common.PrintPanicStack()
for {
d := timer.NewDispatcher(1)
stdtime := time.Now()
tomorrow := stdtime.AddDate(0, 0, 1)
//godump.Dump(stdtime.Unix())
t := time.Date(tomorrow.Year(), tomorrow.Month(), tomorrow.Day(), 0, 0, 0, 0, time.Local)
du := time.Duration(t.Unix()-stdtime.Unix()) * time.Second
// godump.Dump(time.Since(t) / time.Second)
// godump.Dump(time.Since(t))

    d.AfterFunc(du, func() {
        //这里添加你的代码,可以调用你要执行的函数
    })
    (<-d.ChanTimer).Cb()
}

}

# 1

zenghao306

上面还有timer包没上传,里面就一个文件,我干脆也分享了:
package timer

import (
“runtime”
“time”
)

var LenStackBuf = 4096

type Dispatcher struct {
ChanTimer chan *Timer
}

func NewDispatcher(l int) Dispatcher {
disp := new(Dispatcher)
disp.ChanTimer = make(chan
Timer, l)
return disp
}

// Timer
type Timer struct {
t *time.Timer
cb func()
}

func (t *Timer) Stop() {
t.t.Stop()
t.cb = nil
}

func (t *Timer) Cb() {
defer func() {
t.cb = nil
if r := recover(); r != nil {
if LenStackBuf > 0 {
buf := make([]byte, LenStackBuf)
l := runtime.Stack(buf, false)
}
}
}()

if t.cb != nil {
    t.cb()
}

}

func (disp Dispatcher) AfterFunc(d time.Duration, cb func()) Timer {
t := new(Timer)
t.cb = cb
t.t = time.AfterFunc(d, func() {
disp.ChanTimer <- t
})
return t
}

# 2

nsmei

我们公司用的包是:
github.com/robfig/cron
支持很多奇奇怪怪的定时任务需求,实际应用中,还是需要自己写一些代码控制:
比如某个定时任务 12:00执行,可能正好在12:00进行维护,那么在运行时就需要记录上次运行时间和下次运行时间,这样可以保证一些重要的逻辑在起服时强制执行一次~可以看接口 Schedule ,用起来很简单…

# 3