关于项目优雅关闭问题
来源:11-2 实现完善的TCP服务器

慕瓜9063200
2023-04-29
老师你好,
func ListenAndServeWithSignal(cfg *Config, handler tcp.Handler) error {
closeChan := make(chan struct{})
signChan := make(chan os.Signal)
signal.Notify(signChan, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
go func() {
// 接收系统信号
sign := <-signChan
switch sign {
case syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
closeChan <- struct{}{}
}
}()
listener, err := net.Listen("tcp", cfg.Address)
if err != nil {
logger.Error("listerAndServer")
return err
}
logger.Info("start listen")
ListenAndServe(listener, handler, closeChan)
return nil
}
这段代码中,创建了两个管道用于接收信号,有个疑问,不能只有一个管道吗,只用signChan := make(chan os.Signal),然后在
func ListenAndServe(listener net.Listener, handler tcp.Handler, signChan <-chan os.Signal) {
go func() {
<-signChan // 如果系统没有发信号就会阻塞在这
logger.Info("shut down")
_ = listener.Close()
_ = handler.Close()
}()
defer func() {
_ = listener.Close()
_ = handler.Close()
}()
}
这段代码中就只监听signChan 中的信号,如果有系统信号,那么就关闭服务器关闭连接,这样不可以吗?
写回答
1回答
-
这个地方应该是考虑到,不只是系统信号会触发优雅关闭,有可能会有别的情况也会往closeChan发送struct{}。兼容了其他的优雅关闭路径。
10
相似问题