[技巧]go語言使用select{}阻塞main函數和for range 做定時器服務

go語言使用select{}阻塞main函數和for range 做定時器服務

  • 1.在做遊戲服務器時,我們需要程序啓動時就開啓n個協程,然後不用做任何服務(不佔用CPU時間),但是不能退出。我們可以用下面的代碼實現。
  • 2.有些情況下,我們需要定時的去運行一段服務(代碼),有多GO友,首先想到是time包,下面是一種簡單的定時服務,邏輯簡單,但是也存在一定的風險,需要GO友對goroutine有很深的理解,避免協程之間發生阻塞。

有些情況下,需要讓main函數不退出,讓它在後臺一直執行,我們可以利用 select{}阻塞:

for range不僅能遍歷map,slice,array還能取出channel中數據,range前面可以不用變量接收,time.Tick()返回的是一個channel,每隔指定的時間會有數據從channel中出來,

1.直接上代碼

func main(){
    for i := 0; i < 20; i++ { //啓動20個協程處理消息隊列中的消息
        go thrind(i)
    }
    select {} // 阻塞
}
func thrind( i int){
    for range time.Tick(1000 * time.Millisecond) {  
        fmt.Println("\n 線程:",i)
    }
}

2下面的代碼對 select{}阻塞 的使用是錯的,select{}阻塞需要有線程在運行

func main(){
    for i := 0; i < 20; i++ { //啓動20個協程處理消息隊列中的消息
        go thrind(i)
    }
    select {} // 阻塞
}
func thrind( i int){

}

運行後報錯:
fatal error: all goroutines are asleep - deadlock!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章