> 백엔드 개발 > Golang > Go Listening 서버를 정상적으로 종료하는 방법은 무엇입니까?

Go Listening 서버를 정상적으로 종료하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-24 03:15:12
원래의
652명이 탐색했습니다.

How to Gracefully Shut Down a Go Listening Server?

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 := &amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿