Golang定時任務簡單實現

来源:https://www.cnblogs.com/dubinyang/archive/2020/02/18/12327675.html

下載cron包: go get github.com/robfig/cron 開啟一個定時: 根據cron表達式進行時間調度,cron可以精確到秒,大部分表達式格式也是從秒開始。 c := cron.New()預設從分開始,所以加上cron.WithSeconds(),保證定時按照表達式字面意思執行 ...


下載cron包:

go get github.com/robfig/cron

開啟一個定時:
根據cron表達式進行時間調度,cron可以精確到秒,大部分表達式格式也是從秒開始。
c := cron.New()預設從分開始,所以加上cron.WithSeconds(),保證定時按照表達式字面意思執行。

func main() {
  c := cron.New(cron.WithSeconds()) //精確到秒
  
  //定時任務
  spec := "*/1 * * * * ?" //cron表達式,每秒一次
  c.AddFunc(spec, func() {
     fmt.Println("11111")
  })
  
  c.Start()
  select {}  //阻塞主線程停止
}

停止定時:
由於goroutine沒有線程id,所以無法從外部停止指定的定時任務。cron自帶Stop()方法,支持在方法體里使用,來停止當前定時。
何時調用Stop()方法,需要根據自身業務觸發,例如運行完成100次後停止,資料庫當前狀態為註銷時停止,等等。

func main() {
  c := cron.New(cron.WithSeconds()) //精確到秒
  
  //定時任務
  spec := "*/1 * * * * ?" //cron表達式,每秒一次
  c.AddFunc(spec, func() {
    status := getStatus() //獲取定時任務的狀態
    if status == true {
      fmt.Println("11111")
    } else { 
      c.Stop() //當前定時任務狀態已註銷
    }
  })
  
  c.Start()
  select {}  //阻塞主線程停止
}

開啟多個定時:
一個c對象可以載入多個定時任務,此時在其中一個方法里調用Stop()方法,所有定時任務都會停止。

func main() {
  c := cron.New(cron.WithSeconds()) //精確到秒
  
  //定時任務
  spec := "*/1 * * * * ?" //cron表達式,每秒一次
  c.AddFunc(spec, func() {
     fmt.Println("11111")
  })
  
  spec1 := "*/5 * * * * ?" //cron表達式,每5秒一次
  c.AddFunc(spec1, func() {
     fmt.Println("22222")
  })
  
  c.Start()
  select {}  //阻塞主線程停止
}

常見cron表達式:

表達式如果算上年份,共7位:

秒 分 時 日 月 周 年

實際應用中很少用到年份,所以一般表達式都是6位:

秒 分 時 日 月 周

*/1 * * * * ? 每秒

00 * * * * ? 每分

00 30 22 * * ? 每天晚上22:30

00 30 22 * * 2 每周二晚上22:30

00 30 22 * * 1,3 每周一和周三晚上22:30

*/5 35 10 * * 1-3 每周一到周三上午10點35分00秒開始第一次,然後每5秒一次

00 10,40 14 ? 3 4 每年三月的星期四的下午14:10和14:40

需要更複雜更細緻的表達式寫法,可自行上網查找。

註意:

網上有很多不同的cron包,同一個包版本也有多個,整體用法雖相似,但對cron表達式的處理會有一定差別,例如c := cron.New()有直接從秒開始的,不用加cron.WithSeconds(),也有用5位長度來指定表達式的。

所以,具體使用哪個包,最好下載更新最新版本,表達式的語法也要通過實際測試進行驗證,保證任務按照我們指定的時間執行。

公眾號:李田路口


您的分享是我們最大的動力!

更多相關文章
  • 開發環境: Windows操作系統開發工具:Myeclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖: 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=40 ...
  • 一、前言 在日常運維的過程中,經常需要登錄主機去執行一些命令,有時候需要登錄一批主機執行相同的命,手動登錄執行的化效率太慢, 所以可以通過Python的paramiko模塊批量執行,本篇文章基於python2.7。 二、同步執行 根據ip列表按順序執行,缺點是如果命令耗時長,主機很多的話,執行效率較 ...
  • 由於疫情的原因,所以目前一直在家遠程辦公,所以很多時間在刷面試題,發現2019大廠的面試雖然種類很多,但是總結了一下發現主要是這幾點:演算法和數據結構、 JVM、集合、多線程、資料庫這幾點在面試的時候比較多。今天總結了幾個JVM比較問的多的問題和答案希望可以幫到大家。 1、首先就是JVM垃圾回收機制和 ...
  • 打開python官網https://www.python.org/,然後點擊頁面的downloads導航菜單。在下拉的菜單中選中windows, 直接點擊頁面右側的 python 3.X(X表示對應的版本號),可以下載最新的python安裝包。安裝完畢以後,在命令行中執行python -V來測試是... ...
  • 把x用八進位,十進位、十六進位的形式列印,把y用布爾值的形式列印:int x = 10;cout << oct << x << endl; //show octalcout << dec << x << endl; //show decimalcout << hex << x << endl; //... ...
  • 樹結構基礎 LCA c++ ……(省略,同LCA) int L[N], R[N];//每個子樹代表的區間 int tot;//總時間 //搜索整棵樹, 得到每個節點的深度 void dfs(int u, int f){//u: 一節點 f: 其節點的父親節點 L[u] = ++tot; dep[u] ...
  • [toc] 一.Java的基本數據類型介紹 | 類型 | 關鍵字 | 位數 | 預設值 | 取值範圍 | | : : | : : | : : | : : | : : | | 位元組型 | byte | 8 | 0 | 128~127 | | 短整型 | short | 16 | 0 | 32768~3 ...
  • springboot預設打包成jar,如果想打包成war,則需要做以下三步。 1.修改pom.xml文件 a.將jar改成war 1 <groupId>com.test</groupId> 2 <artifactId>01-springboot-HelloWorld</artifactId> 3 < ...
一周排行
  • 《ASP.NET MVC 企業級實戰》 [作者] (中) 鄒瓊俊[出版] 清華大學出版社[版次] 2017年04月 第1版[印次] 2019年08月 第6次 印刷[定價] 89.00元 【第01章】 (P021) 只有在 Lambda 有一個輸入參數時,括弧才是可選的,否則括弧是必需的。 使用空括弧 ...
  • 上一篇(https://www.cnblogs.com/meowv/p/12971041.html)使用HtmlAgilityPack抓取壁紙數據成功將圖片存入資料庫,本篇繼續來完成一個全網各大平臺的熱點新聞數據的抓取。 同樣的,可以先預覽一下我個人博客中的成品:https://meowv.com/ ...
  • 前言 請了一天假後回公司,同事跟我說使用Newtonsoft.json序列化TreeView對象的時候出現報錯; 啊!什麼?這個類庫不是能夠序列化所有東西嗎?真的很懵逼,也是我第一次使用這個類庫出現問題! 問題異常 異常信息 : Newtonsoft.Json.JsonSerializationEx ...
  • 簡單瞭解下麵詞語的意思 節點:二叉樹中每個元素都稱為節點 葉子節點(簡稱:葉子):度為0的節點,葉子節點就是樹中最底段的節點,葉子節點沒有子節點,也叫終端結點 分枝節點:度不為0的結點 節點的度:二叉樹的度代表某個節點的孩子或者說直接後繼的個數,簡單說就是一個節點擁有的子樹數 樹的度: 樹中最大的結 ...
  • C# 中的LINQ 提供了兩種操作方式,查詢表達式和查詢操作符,所有的查詢表達式都有對應的查操作符類替代,查詢表達式有點“類” SQL,在代碼中寫SQL,總覺得不夠“優雅”,使用查詢操作符就顯得“優雅”很多, 本系列就來對所有的LINQ 標準操作符進行一個全面的總結,這些操作符和我上篇文章總結的Rx ...
  • 在Startup ConfigureServices 註冊本地化所需要的服務AddLocalization和 Configure<RequestLocalizationOptions> public void ConfigureServices(IServiceCollection services ...
  • 為什麼需要持久化,以及Redis持久化的RDB方式在這篇文章講的已經很透徹了,足以弔打面試官了。而且此篇內容需要RDB文章的內容支持,所以建議先看下:看完這篇還不懂Redis的RDB持久化,你們來打我! 一、什麼是AOF 它也是Redis持久化的重要手段之一,aof->Append Only Fil ...
  • 先上圖: @IT程式猿 微博網友評論: @迢書:前同事的,親眼見過 @AvenGeeker:Bug 404 @科技州:這是要逼死強迫症 @小島一瞥:哈哈哈哈哈我老家的車 最後小編整理了一套技術資料不僅能精準消除技術盲點、累計面試經驗,更可以攻剋JVM、Spring、分散式、微服務等技術難題。 海量電 ...
  • 概括來說,分三步: 1,首先找到是哪個進程的CPU占有率飆到了100%。 2,根據進程號pid,定位到是哪個線程,找到對應線程的tid。 3,導出對應線程的dump日誌文件,分析日誌文件定位具體代碼。 要解決這個問題,你應該具備以下技能: 1,linux的top命令。 2,jvm監控工具jps。 3 ...
  • 寫在最後 程式員為何害怕【別人的代碼】呢?這讓我想起一個段子。 寫這段代碼時 只有上帝和我知道他是幹嘛的 現在 只有上帝知道了 別人的代碼,似乎總意味著冗長、晦澀、凌亂,給人一種不想靠近的感覺。搞笑的是,對於一些程式員而言,即使是自己的代碼,在一段時間之後自己再拿來看,也成了【別人的代碼】... 作 ...