Interaction entre l'importation de packages nets et la détection de blocages
Dans un programme Go, si une opération de canal se bloque pendant l'exécution du programme, le programme finira par recevoir une erreur de « blocage ». Cependant, le comportement change lorsque le package net est importé.
L'extrait de code en question :
<code class="go">package main import ( "fmt" "net/http" ) func main() { var ch = make(chan int) ch <- 1 }</code>
Si le package net/http n'est pas importé, le programme se termine avec un "deadlock " erreur. En effet, l'opération de canal (envoi vers un canal sans tampon) se bloque pour toujours et aucune autre goroutine n'est en cours d'exécution pour effectuer des opérations asynchrones qui permettraient au détecteur de blocage d'identifier le problème.
Cependant, lorsque le net/http Le package est importé, le programme ne se bloque pas. En effet, l'importation du package net démarre l'interrogation en arrière-plan des Goroutines qui désactivent efficacement le détecteur de blocage.
Le package net inclut des fonctionnalités de gestion des connexions réseau et utilise les Goroutines pour gérer les connexions de manière asynchrone. Ces Goroutines d'interrogation en arrière-plan continuent de s'exécuter même si aucune connexion HTTP n'est en cours d'établissement ou de traitement, ce qui fait que le programme apparaît non bloquant pour le détecteur de blocage. Par conséquent, le programme ne se termine pas avec une erreur « deadlock », malgré le fonctionnement du canal bloqué.
Ce comportement a été discuté dans le problème GitHub 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!