Interblocage dans les canaux non tamponnés au sein d'une seule goroutine
Dans le modèle de concurrence Go, un canal non tamponné dans la même goroutine peut conduire à une impasse . Cela se produit parce que l'opération de l'expéditeur sur un tel canal se bloque jusqu'à ce qu'un destinataire récupère la valeur.
Considérons l'exemple suivant :
package main import "fmt" func main() { c := make(chan int) c <- 1 fmt.Println(<-c) }
Lorsqu'il est exécuté, ce code entraîne un blocage avec ce qui suit erreur :
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.main() /home/example/src/go/main.go:8 +0x52 exit status 2
Explication
Un canal sans tampon agit comme un canal toujours plein. Lorsqu'il n'y a aucun autre goroutine à recevoir du canal, l'opération de l'expéditeur se bloque indéfiniment. Dans l'exemple ci-dessus, l'opération c <- 1 se bloque car il n'y a pas de récepteur. Puisqu'aucune autre goroutine ne peut progresser, le programme se retrouve dans une impasse.
Résoudre l'impasse
Il existe plusieurs façons de résoudre l'impasse :
En comprenant le comportement des canaux sans tampon et en appliquant les stratégies de résolution appropriées, vous pouvez éviter les blocages lorsque vous travaillez avec la concurrence dans Go.
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!