幾個月前,我在考慮如何在Go中為RPC庫實現可關閉的事件循環。我設法方便地關閉服務器,如下所示:type Server struct { listener net.Listener closeChan chan bool routines sync.WaitGroup}func (s *Server) Serve() { s.routines.Add(1) defer s.routines.Done() defer s.listener.Close() for { select { case <-s.closeChan: // close server etc. default: s.listener.SetDeadline(time.Now().Add(2 * time.Second)) conn, _ := s.listener.Accept() // handle conn routine } }}func (s *Server) Close() { s.closeChan <- true // signal to close serve routine s.routines.Wait()}我發現此實現的問題在于它涉及超時,這意味著最小關閉時間比可能的要多2秒。有沒有更慣用的方法來創建事件循環?
在Go中偵聽事件的慣用方法是什么?
慕工程0101907
2021-05-19 13:10:44