日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go执行定时任务

發布時間:2024/4/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go执行定时任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

自己寫的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 intDuration intUrl stringCh 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 <- 1fmt.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")}} }

?

轉載于:https://my.oschina.net/qii/blog/741551

總結

以上是生活随笔為你收集整理的go执行定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。