gpt4 book ai didi

events - Go 中监听事件的惯用方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:40:17 24 4
gpt4 key购买 nike

几个月前,我在考虑如何在 Go 中为 RPC 库实现一个 closable 事件循环。我设法像这样关闭服务器:

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 中的事件循环不需要是循环。

在单独的 goroutine 中处理关闭和连接似乎更简单:

go func() {
<-s.closeChan
// close server, release resources, etc.
s.listener.Close()
}()
for {
conn, err := s.listener.Accept()
if err != nil {
// log, return
}
// handle conn routine
}

请注意,您也可以在不使用 channel 的情况下直接在 Close 函数中关闭监听器。我这里做的是利用Listener.Accept的错误返回值来方便程序间通信。

如果在关闭和连接处理实现的某个时刻您需要保护您在回答时关闭的某些资源,您可以使用 a Mutex .但通常可以避免这种情况。

关于events - Go 中监听事件的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com