Heim > Backend-Entwicklung > Golang > Wie kann ich einen Go-Listening-Server ordnungsgemäß und ohne falsche Fehler stoppen?

Wie kann ich einen Go-Listening-Server ordnungsgemäß und ohne falsche Fehler stoppen?

Linda Hamilton
Freigeben: 2024-12-12 18:59:10
Original
842 Leute haben es durchsucht

How Can I Gracefully Stop a Go Listening Server Without Spurious Errors?

Ordnungsgemäßes Stoppen eines Listening-Servers in Go

Hintergrund

Das Netzpaket von Go bietet die Möglichkeit, Listening-Server zu erstellen. Das ordnungsgemäße Stoppen dieser Server kann jedoch aufgrund der blockierenden Natur der listen.Accept-Methode eine Herausforderung darstellen.

Bestehender Ansatz

Ein gängiger Ansatz zum Stoppen eines Servers besteht darin, den Listening-Socket zu schließen. Allerdings kann es dabei zu Fehlern kommen, die von echten Fehlern bei der Verbindungsannahme nicht zu unterscheiden sind. Daher zeigt das folgende Code-Snippet dieses Problem:

// ...

// 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
    }
    // ...
  }
  // ...
}
Nach dem Login kopieren

Erweiterter Ansatz

Um diese Einschränkung zu beheben, können wir den es.done-Kanal verwenden, um ein Signal zu senden, bevor der Server es tut gestoppt. So kann der Code verbessert werden:

// ...

// 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()
}
Nach dem Login kopieren

Durch das Senden eines Werts an den es.done-Kanal vor dem Schließen des Listening-Sockets kann die Serve-Funktion feststellen, wann der Server gestoppt wird, und ordnungsgemäß beendet werden, ohne dass eine falsche Protokollierung erfolgt Fehler.

Das obige ist der detaillierte Inhalt vonWie kann ich einen Go-Listening-Server ordnungsgemäß und ohne falsche Fehler stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage