Go에서 Listening 서버를 정상적으로 중지하는 방법
Go에서는 Listen.Accept 함수가 실행을 차단하여 종료하기 어렵게 만듭니다. 서버를 정상적으로 청취합니다. 서버를 종료할 시기를 결정하기 위한 한 가지 방법은 청취 소켓을 닫고 네트워크 연결이 닫혔음을 나타내는 특정 오류를 감지하는 것입니다. 그러나 이 오류는 넷 패키지에서 내보내지지 않으므로 개발자는 어색한 오류 처리에 의존하게 됩니다.
다행히도 더 우아한 솔루션이 있습니다. 완료 채널을 활용하면 연결을 닫기 전에 서버에 중지 신호를 보낼 수 있습니다. 샘플 코드로 구현하는 방법은 다음과 같습니다.
package main import ( "io" "log" "net" "sync" "time" ) // Echo server struct type EchoServer struct { listen net.Listener done sync.WaitGroup } // Respond to incoming connection // // Write the address connected to then echo func (es *EchoServer) respond(remote *net.TCPConn) { defer remote.Close() _, err := io.Copy(remote, remote) if err != nil { log.Printf("Error: %s", err) } } // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // Server has been stopped, so we can exit without showing the error. default: log.Printf("Accept failed: %v", err) } return } es.done.Add(1) // Increment the waitgroup for each incoming connection go func() { es.respond(conn.(*net.TCPConn)) es.done.Done() // Decrement the waitgroup when done handling the connection }() } } // Stop the server by closing the listening listen func (es *EchoServer) stop() { es.done.Wait() // Wait for all outstanding connections to finish handling es.listen.Close() // Now it the Accept will have an error above } // Make a new echo server func NewEchoServer(address string) *EchoServer { listen, err := net.Listen("tcp", address) if err != nil { log.Fatalf("Failed to open listening socket: %s", err) } es := &EchoServer{ listen: listen, } es.done.Add(1) go es.serve() return es } // Main func main() { log.Println("Starting echo server") es := NewEchoServer("127.0.0.1:18081") // Run the server for 1 second time.Sleep(1 * time.Second) // Close the server log.Println("Stopping echo server") es.stop() }
이 코드에서 Serve 함수는 done 채널에서 값이 수신되면 반환하여 서버를 정상적으로 종료합니다. 주요 함수는 서버를 시작하고, 연결을 기다린 다음, 서버를 정상적으로 종료하는 방법을 보여줍니다. 완료 채널을 활용하면 오류 처리가 종료 논리와 완전히 분리되어 유지 관리가 용이하고 오류가 없는 서버가 됩니다.
위 내용은 Go Listening 서버를 정상적으로 종료하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!