這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
上次寫了一篇關於golang crontab的用愛瘋,這次說下golang timer定時器的用法。 golang的time.NewTicker建立定時任務時,是阻塞同步的。如果不想因為同步阻塞了main線程,可以給每個定時函數分配一個goroutine協程。
該文章寫的有些亂,歡迎來噴 ! 另外文章後續不斷更新中,請到原文地址查看更新。
http://xiaorui.cc/2016/03/06/%E5%85%B3%E4%BA%8Egolang-timer%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E8%AF%A6%E7%BB%86%E7%94%A8%E6%B3%95/
golang的time模組提供了兩個定時函數。 需要注意的是golang timer定時器是不能stop停止的,只能在邏輯上通過標示位來退出定時任務 。
Python// xiaorui.cc// 使用AfterFunctime.AfterFunc(5 * time.Minute, func() { fmt.Printf("expired")}// timer := time.NewTimer(5 * time.Minute)<-timer.Cfmt.Printf("expired")
123456789101112 |
// xiaorui.cc // 使用AfterFunctime.AfterFunc(5 * time.Minute, func() { fmt.Printf("expired")} // timer := time.NewTimer(5 * time.Minute)<-timer.Cfmt.Printf("expired") |
時間格式:
Python秒:time.Second分鐘:time.Minute
123456 |
秒:time.Second 分鐘:time.Minute |
下面是go timer的具體使用執行個體。
Pythonpackage main// xiaorui.ccimport ("fmt""time")func testTimer1() {go func() {fmt.Println("test timer1")}()}func testTimer2() {go func() {fmt.Println("test timer2")}()}func timer1() {timer1 := time.NewTicker(2 * time.Second)select {case <-timer1.C:testTimer1()}}func timer2() {timer2 := time.NewTicker(3 * time.Second)select {case <-timer2.C:testTimer2()}}func main() {go timer1()go timer2()fmt.Println("will end")time.Sleep(5 * time.Second)}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
package main// xiaorui.ccimport ("fmt""time") func testTimer1() {go func() {fmt.Println("test timer1")}() } func testTimer2() {go func() {fmt.Println("test timer2")}()} func timer1() {timer1 := time.NewTicker(2 * time.Second)select {case <-timer1.C:testTimer1()} } func timer2() {timer2 := time.NewTicker(3 * time.Second) select {case <-timer2.C:testTimer2()} } func main() {go timer1()go timer2()fmt.Println("will end")time.Sleep(5 * time.Second)} |