Éviter les erreurs de blocage avec les importations HTTP Go
Dans Go, l'utilisation du package net/http pour la communication HTTP introduit un comportement subtil qui peut affecter la détection des blocages.
Considérez le code suivant :
<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>
Sans l'import net/http, l'exécution de ce code entraînerait une erreur "deadlock". En effet, la fonction Extract est bloquée sur une requête HTTP sans appel correspondant à ServeHTTP ou Close.
Cependant, si le package net/http est importé, même sans appeler la fonction Extract, l'erreur "deadlock" disparaît. En effet, l'importation du package net démarre l'interrogation en arrière-plan des Goroutines qui communiquent automatiquement avec le serveur HTTP.
Ce comportement est documenté dans le billet de blog Go "Goroutine Pooling in NetHttp":
"The net Le package démarre une simple goroutine d'arrière-plan qui teste périodiquement l'accessibilité au serveur HTTP. La goroutine de test simple se termine si le serveur HTTP n'est pas accessible, puis redémarre lorsque le serveur devient accessible. Cela garantit que les goroutines qui ont net.Dial dans leur appel. pile ne sont pas signalés par erreur comme étant bloqués. détection de blocage, il est recommandé d'éviter d'importer le package net jusqu'à ce qu'il soit nécessaire d'établir la communication avec un serveur HTTP.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!