Deadlock-Fehler mit Go-HTTP-Importen vermeiden
In Go führt die Verwendung des net/http-Pakets für die HTTP-Kommunikation zu einem subtilen Verhalten, das Auswirkungen haben kann die Erkennung von Deadlocks.
Bedenken Sie den folgenden Code:
<code class="go">package main import ( "fmt" "net/http" ) func Extract(url string) ([]string, error) { http.Get(url) var links []string return links, nil } func crawl(url string) []string { list, _ := Extract(url) return list } func main() { var ch = make(chan int) ch <- 1 }</code>
Ohne den Net/http-Import würde die Ausführung dieses Codes zu einem „Deadlock“-Fehler führen. Dies liegt daran, dass die Extract-Funktion bei einer HTTP-Anfrage ohne einen entsprechenden Aufruf von ServeHTTP oder Close blockiert wird.
Wenn jedoch das net/http-Paket importiert wird, auch ohne Aufruf der Extract-Funktion, tritt der „Deadlock“-Fehler auf verschwindet. Dies liegt daran, dass beim Importieren des Netzpakets Hintergrundabfragen von Goroutinen gestartet werden, die automatisch mit dem HTTP-Server kommunizieren.
Dieses Verhalten ist im Go-Blogbeitrag „Goroutine Pooling in NetHttp“ dokumentiert:
„The net Das Paket startet eine einfache Hintergrund-Goroutine, die regelmäßig die Erreichbarkeit des HTTP-Servers testet, und startet dann neu, wenn der Server erreichbar ist. Dadurch wird sichergestellt, dass Goroutinen, die net.Dial in ihrem Aufruf haben Stack werden nicht fälschlicherweise als blockiert gemeldet Bei der Deadlock-Erkennung wird empfohlen, den Import des Netzpakets zu vermeiden, bis die Kommunikation mit einem HTTP-Server hergestellt werden muss.
Das obige ist der detaillierte Inhalt vonWie wirkt sich der Import des net/http-Pakets in Go auf die Deadlock-Fehlererkennung aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!