„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich einen Go-TCP-Server ordnungsgemäß herunterfahren und die Goroutine „(*TCPListener) Accept“ unterbrechen?

Wie kann ich einen Go-TCP-Server ordnungsgemäß herunterfahren und die Goroutine „(*TCPListener) Accept“ unterbrechen?

Veröffentlicht am 12.11.2024
Durchsuche:895

How to Gracefully Shut Down a Go TCP Server and Interrupt the `(*TCPListener) Accept` Goroutine?

Unterbrechen einer Go-Routine Ausführen (*TCPListener) Akzeptieren

Beim Erstellen eines TCP-Servers in Go stoßen Sie möglicherweise auf die Herausforderung, ordnungsgemäß zu arbeiten Herunterfahren des Servers und Unterbrechen der Goroutine-Verarbeitung func (*TCPListener) Accept.

In Go blockiert func (*TCPListener) Accept die Ausführung, bis eine Verbindung empfangen wird. Um diese Goroutine zu unterbrechen, sollten Sie Folgendes tun:

Schließen Sie den net.Listener:

Der Schlüssel zum Unterbrechen der Accept-Goroutine besteht darin, den net.Listener zu schließen, der vom Netz erhalten wurde. Hören(...). Indem Sie den Listener schließen, signalisieren Sie dem Betriebssystem, dass keine weiteren Verbindungen empfangen werden, wodurch die Accept-Goroutine beendet wird.

Rückkehr von der Goroutine:

Nach dem Schließen Stellen Sie als Zuhörer sicher, dass Ihre Goroutine zurückkehrt. Wenn die Goroutine nach dem Accept-Aufruf Code enthält, wird sie weiterhin ausgeführt und kann unbeabsichtigtes Verhalten oder Fehler verursachen.

Beispielcode:

package main

import (
    "fmt"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // Handle error
    }

    go func() {
        for {
            conn, err := ln.Accept()
            if err != nil {
                if err == net.ErrClosed {
                    return // Listener was closed
                }
                // Handle other errors
            }
            // Handle connection
            conn.Close()
        }
    }()

    fmt.Println("Press enter to stop...")
    var input string
    fmt.Scanln(&input)

    ln.Close() // Close the listener, interrupting the Accept loop
}

Dieser Code erstellt einen TCPListener auf Port 8080 und startet eine Goroutine, die eingehende Verbindungen in einer Endlosschleife verarbeitet. Wenn der Benutzer die Eingabetaste drückt, schließt das Programm den Listener und unterbricht den blockierenden Accept-Aufruf, wodurch die Goroutine zurückkehrt.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3