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"))
}
posted @ 2022-06-20 11:23  熊先生不开玩笑  阅读(109)  评论(0)    收藏  举报