数か月前、私はRPC ライブラリのために、Go でクローズ可能なイベント ループを実装する方法を考えていました。次のようにサーバーを簡単に閉じることができました。
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 秒長くなります。イベントループを作成するより慣用的な方法はありますか?