go執行定時任務

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

自己寫的go定時器執行任務,歡迎拍磚。

package mainimport ("fmt""time"   "bufio"   "os"   "strings"   "errors"   "io/ioutil"   "strconv"   "regexp"   "net/http")var taskList []*Tasktype MyTimer struct{   Config []map[string]interface{}}func NewMyTimer() *MyTimer{   return &MyTimer{}}func (t *MyTimer) Start(){   for _, v := range t.Config{      //針對每個設定,啟動任務      myTask := NewTask(v)      myTask.Start()      taskList = append(taskList, myTask)   }   fmt.Println("---------- Timer Started ---------")}func (t *MyTimer) Stop(){   for _, task := range taskList{      task.Stop()   }   //清空task列表   taskList = make([]*Task, 0)   fmt.Println("--------- Timer Stoped ----------")}func (t *MyTimer) Restart(){   t.Stop()   t.Start()   fmt.Println("-------- Timer Restarted ----------")}func (t *MyTimer) LoadConfigFile(fileName string) error{   file,err:=os.Open(fileName)   if nil!=err{      return errors.New("config file load failed:"+fileName)   }   defer file.Close()   config:=make([]map[string]interface{}, 0)   content,ok:=ioutil.ReadAll(file)   if ok!=nil{      return errors.New("read config file error")   }   str:=string(content)   reg:=regexp.MustCompile("[\r\n]+")   array := reg.Split(str, -1)   for _,val:=range array{      //#;號開頭的,作為注釋      if strings.HasPrefix(val, "#") || strings.HasPrefix(val, ";"){         continue      }      if len(val) > 0{         kv := strings.Split(val, "|")         m:=make(map[string]interface{})         m["url"] = kv[0]         if len(kv) > 1{            m["duration"], _ = strconv.Atoi(kv[1])         } else {            m["duration"] = 10         }         if len(kv) > 2{            m["times"], _ = strconv.Atoi(kv[2])         } else {            m["times"] = 1         }         config = append(config, m)      }   }   t.Config = config;   return nil}type Task struct{   Times int   Duration int   Url string   Ch chan int}func NewTask(v map[string]interface{}) *Task{   c:=make(chan int,1)   return &Task{Times: v["times"].(int), Duration: v["duration"].(int), Url: v["url"].(string), Ch: c}}func (task *Task) Start(){   timer := time.NewTicker(time.Duration(task.Duration) * time.Second)   go func(c chan int){      if task.Times == 0{         forEnd1:         for {            select{            case <- timer.C:               http.Get(task.Url)               fmt.Println("task request url: "+task.Url)            case <-c:               break forEnd1            }         }      } else {         forEnd2:         for i := 0; i < task.Times; i ++{            select{            case <- timer.C:               http.Get(task.Url)               fmt.Println("task request url: "+task.Url)            case <- c:               break forEnd2            }         }         //執行完成後,需要銷毀計時器         for k,v := range taskList{            if v == task{               if k == 0{                  taskList = taskList[1:]               } else if (k + 1) == len(taskList){                  taskList = taskList[:k]               } else {                  taskList = append(taskList[k+1:], taskList[:k+2]...)               }               break            }         }      }   }(task.Ch)}func (task *Task) Stop(){   task.Ch <- 1   fmt.Println("---task stoped---")}func main() {   //控制台輸入   reader:=bufio.NewReader(os.Stdin)   timer:=NewMyTimer()   ok:=timer.LoadConfigFile("config.txt")   if ok!=nil{      fmt.Println(ok)      // panic("error")   }   for{      fmt.Println("Enter a command :")      rawLine,_,_:=reader.ReadLine()      command:=string(rawLine)      if "q" == command || "quit" == command{         timer.Stop()         fmt.Println("bye")         break      } else if "start" == command{         timer.Start()      } else if "stop" == command{         timer.Stop()      } else if "restart" == command {         timer.Restart()      } else if "help" == command {         fmt.Println("****Welcome to use MyTimer****")         fmt.Println("There is commands and options:")         fmt.Println("start --start task jobs")         fmt.Println("stop --stop task jobs")         fmt.Println("restart --restart jobs")         fmt.Println("quit --quit the job task, also can use short command q")         fmt.Println("help --help infomation of MyTimer")      } else {         fmt.Println("Unknow command")      }   }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.