golang 手写实现多台机器执行定时任务
多台机器,固定间隔每台分别去执行任务。
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
// 周期60 秒, 获取当前秒钟数,
r := 60
interval := 5
// 机器节点数
node := []string{"node-1", "node-2","node-2"}
localIntranetIP := "node-1"
arr := []int{}
for i:=0; i< r; i=i + int( interval) {
arr = append(arr, i)
}
var index int
var setIndex bool
for key, value := range node {
if value == localIntranetIP {
index = key
setIndex = true
break
}
}
if !setIndex {
fmt.Println("no set index !")
return
}
l := len(node)
m := make([][]int, l)
for key, value := range arr {
s := key % l
m[s] = append(m[s], value)
}
var selfTimer = []int{}
if len(m) >= index + 1 {
selfTimer = m[index]
}
fmt.Println(m)
fmt.Println(selfTimer)
// 初始 200毫秒
timer := time. NewTimer( 200*time.Millisecond)
defer timer.Stop()
var lastTime int
selfTimerLen := len(selfTimer)
for {
select {
case <- timer.C:
timer.Reset( 200*time.Millisecond)
secTime := nowTimeSec()
for key, _ := range selfTimer {
// 数组末尾值
if key == selfTimerLen - 1 && lastTime != selfTimer[key] && secTime > selfTimer[key] {
lastTime = selfTimer[key]
doWork()
} else if key < selfTimerLen - 1 && selfTimer[key] < secTime && secTime <= selfTimer[key + 1 ] && lastTime != selfTimer[key] {
lastTime = selfTimer[key]
doWork()
}
}
}
}
}
func nowTimeSec() int {
secStr := time.Now().Format("05")
secInt, _ := strconv.Atoi(secStr)
return secInt
}
func doWork() {
fmt.Println("do work !", time.Now().Format("2006-01-02 15:04:05"))
}

浙公网安备 33010602011771号