请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于项目优雅关闭问题

老师你好,

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{}。兼容了其他的优雅关闭路径。

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号