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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux单次任务调度,go任务调度2(linux的cron调用)

發布時間:2023/12/19 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux单次任务调度,go任务调度2(linux的cron调用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

cron格式:

分 時 日 月 周

每隔5分鐘執行1次: /5 * echo hello > /tmp/x.log

每隔1-5分鐘執行1次: 1-5 echo hello > /tmp/x.log

每天10點整、22點整執行1次: 0 10,22 * echo hello > /tmp/x.log

每隔1-5分鐘執行1次: 1-5 echo hello > /tmp/x.log

Parse():解析與校驗Cron表達式

Next():根據當前時間,計算下次調度時間

package main

import (

"fmt"

"github.com/gorhill/cronexpr"

"time"

)

func main() {

var (

expr *cronexpr.Expression

err error

now time.Time

nextTime time.Time

)

//每隔5分鐘執行一次(這個庫支持7位,精確到秒、年)

if expr, err = cronexpr.Parse("*/5 * * * * * *"); err != nil {

fmt.Println(err)

return

}

//當前時間

now = time.Now()

//下次調度時間

nextTime = expr.Next(now)

//等待這個定時器超時

time.AfterFunc(nextTime.Sub(now), func() {

fmt.Println("被調度了:", nextTime)

}) //下次時間減去當前時間

time.Sleep(10 * time.Second)

}

調用一個cron

輸出:被調度了: 2019-04-19 17:00:30 +0800 CST

package main

import (

"fmt"

"github.com/gorhill/cronexpr"

"time"

)

//代表一個任務

type CronJob struct {

expr *cronexpr.Expression

nextTime time.Time //expr.Next(time.Now())就可以得到下一次調度時間

}

func main() {

//需要有1個調度協程,它定時檢查所有Cron任務,誰過期了就執行誰

var (

cronJob *CronJob

expr *cronexpr.Expression

now time.Time

scheduleTable map[string] *CronJob //key:任務名字,

)

scheduleTable = make(map[string]*CronJob)

//當前時間

now = time.Now()

//定義第一個cronjob

expr = cronexpr.MustParse("*/5 * * * * * *")

cronJob = &CronJob{

expr: expr,

nextTime: expr.Next(now),

}

//任務注冊到了調度表

scheduleTable["job1"] = cronJob

//定義第二個cronjob

expr = cronexpr.MustParse("*/5 * * * * * *")

cronJob = &CronJob{

expr: expr,

nextTime: expr.Next(now),

}

//任務注冊到了調度表

scheduleTable["job2"] = cronJob

//啟動調度協程

go func() {

var (

jobName string

cronJob *CronJob

now time.Time

)

//定時檢查任務調度表是否有到期的

for {

now = time.Now()

for jobName, cronJob = range scheduleTable {

//判斷是否過期(如果下次調度時間早于等于當前時間,說明已經過期了)

if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) {

//啟動一個協程,執行這個任務

go func(jobName string) {

fmt.Println("執行:", jobName)

}(jobName)

//計算下一次調度時間

cronJob.nextTime = cronJob.expr.Next(now)

fmt.Println(jobName, "下次執行時間:", cronJob.nextTime)

}

}

select {

//睡眠100毫秒(不讓它占用過多cpu)

case

}

}

}()

time.Sleep(100 * time.Second)

}

調用多個cron,按時間間隔輸出:

執行: job1

job1 下次執行時間: 2019-04-19 17:31:20 +0800 CST

job2 下次執行時間: 2019-04-19 17:31:20 +0800 CST

執行: job2

執行: job1

job1 下次執行時間: 2019-04-19 17:31:25 +0800 CST

執行: job2

job2 下次執行時間: 2019-04-19 17:31:25 +0800 CST

執行: job1

job1 下次執行時間: 2019-04-19 17:31:30 +0800 CST

job2 下次執行時間: 2019-04-19 17:31:30 +0800 CST

執行: job2

......

有疑問加站長微信聯系(非本文作者)

總結

以上是生活随笔為你收集整理的linux单次任务调度,go任务调度2(linux的cron调用)的全部內容,希望文章能夠幫你解決所遇到的問題。

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