关于项目优雅关闭问题

来源: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回答

Moody

2023-05-04

这个地方应该是考虑到,不只是系统信号会触发优雅关闭,有可能会有别的情况也会往closeChan发送struct{}。兼容了其他的优雅关闭路径。

1
0

深入Go底层原理,重写Redis中间件实战

深入Go语言原理+Go重写Redis

474 学习 · 172 问题

查看课程