2017-06-14 1381 views
0

我想每幾秒鐘運行一次(通過websocket更新客戶端)。我認爲我應該使用time.Ticker。但是,我如何才能使其發揮作用?我有以下,但它不工作...Golang:每隔幾秒用Ticker運行一次東西

func main() { 
    hub = NewAppSocketHub() 

    ticker := time.NewTicker(time.Second) 
    go func() { 
     for { 
      log.Printf("In loop") 
      select { 
      case <-ticker.C: 
       log.Printf("Broadcasting to %d clients", len(hub.Clients)) 
       hub.Broadcast <- UpdatePayload{ 
        InstanceID: "Test", 
        Status:  "running", 
       } 
      } 
     } 
     log.Printf("Out of loop") 
    }() 

    r := chi.NewRouter() 
    r.Use(render.SetContentType(render.ContentTypeJSON)) 
    r.Use(Cors) 

    r.Post("/auth/login", Login) 
    r.HandleFunc("/ws", WebSocketEcho) 
    // ... 

    http.ListenAndServe(":9000", r) 
    log.Printf("Ended...") 
} 

我認爲你可以忽略NewAppSocketHub和其他應用程序特定的實現。我目前遇到的問題是我得到

2017/06/14 16:08:05 In loop 
2017/06/14 16:08:06 Broadcasting to 0 clients 

它似乎循環休息?怎麼了?

+0

'select'背後的意圖是什麼? – Volker

回答

1

由於不知道hub的實現情況,向hub.Broadcast通道發送消息是阻塞的,因此如果沒有人正在使用消息,它將等待,阻止循環繼續。

+0

我沒有想到它,但你是對的。 'hub.Broadcast'被阻塞,因爲我沒有運行'Hub.run()'從通道中消耗項目。 –