Go의 net 패키지는 청취 서버를 생성하는 기능을 제공합니다. 그러나 이러한 서버를 정상적으로 중지하는 것은 listening.Accept 메서드의 차단 특성으로 인해 어려울 수 있습니다.
서버를 중지하는 일반적인 접근 방식 중 하나는 청취 소켓을 닫는 것입니다. 그러나 이로 인해 연결 수락 시 실제 오류와 구별할 수 없는 오류가 발생할 수 있습니다. 결과적으로 다음 코드 조각은 이 문제를 나타냅니다.
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() // FIXME: I'd like to detect "use of closed network connection" here // FIXME: but it isn't exported from net if err != nil { log.Printf("Accept failed: %v", err) break } // ... } // ... }
이 제한 사항을 해결하기 위해 es.done 채널을 활용하여 서버가 종료되기 전에 신호를 보낼 수 있습니다. 중지되었습니다. 코드를 개선할 수 있는 방법은 다음과 같습니다.
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // Server is being stopped, so we can exit without logging the error. default: log.Printf("Accept failed: %v", err) } return } // ... } } // Stop the server by closing the listening socket func (es *EchoServer) stop() { es.done <- true es.listen.Close() }
리스닝 소켓을 닫기 전에 es.done 채널에 값을 전송하면 서버 함수가 서버가 중지되는 시기를 확인하고 허위 로그를 기록하지 않고 정상적으로 종료할 수 있습니다. 오류가 발생했습니다.
위 내용은 허위 오류 없이 Go Listening 서버를 어떻게 정상적으로 중지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!