2017-06-14 86 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()'从通道中消耗项目。 –

相关问题