先扔代码,之后写思路
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"os"
"os/signal"
"sync"
"time"
)
var needStop = false
var needStopL = &sync.Mutex{}
func stop() {
needStopL.Lock()
defer needStopL.Unlock()
needStop = true
}
func getStop() bool {
needStopL.Lock()
defer needStopL.Unlock()
return needStop
}
func heart() {
for {
fmt.Println("HEART_IN_RUN_JOB :", time.Now())
time.Sleep(time.Second * 5)
if getStop() {
fmt.Println("接收到终止信号,当前任务结束")
return
}
}
}
var c = cron.New()
func main() {
fmt.Println("hello")
_, err := c.AddFunc("* * * * *", heart)
if err != nil {
fmt.Println(err)
}
go c.Run()
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
// 这一句是 go chan 等待接受值,只是把接到的值直接扔掉了,此处是主协程的阻塞处
<-quit
fmt.Println("开始停止")
ctx := c.Stop()
stop()
<-ctx.Done()
fmt.Println("主协程终止")
}