Pourquoi ce code ne génère-t-il pas d'erreur « Deadlock » ?
Le code fourni inclut une instruction d'importation pour le package net/http mais n'invoque pas ses fonctions. Malgré cela, le message d'erreur « deadlock » n'est pas produit.
Explication
L'importation du package net initialise les Goroutines d'interrogation en arrière-plan qui désactivent efficacement le détecteur de blocage. Le détecteur de blocage s'appuie sur la capacité du moteur d'exécution à détecter lorsque les canaux ne reçoivent aucune donnée. Cependant, les Goroutines d'interrogation en arrière-plan génèrent une activité de canal intermittente, ce qui trompe le détecteur de blocage et l'empêche de signaler les blocages.
Exemple
Considérez le code suivant :
package main import ( "fmt" "net/http" ) func main() { var ch = make(chan int) ch <- 1 }
Si l'import net/http est supprimé, le code générera l'erreur "deadlock" attendue car le canal ne reçoit jamais de données d'un autre Goroutine. Cependant, avec l'importation net/http présente, les Goroutines d'interrogation en arrière-plan fournissent l'activité de canal nécessaire pour empêcher que l'erreur de blocage ne soit signalée.
Lectures complémentaires
Ce comportement est abordé plus en détail dans le numéro GitHub suivant : https://github.com/golang/go/issues/12734
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!