Maison > développement back-end > Golang > Les canaux sans tampon dans une seule Goroutine peuvent-ils provoquer des blocages dans Go ?

Les canaux sans tampon dans une seule Goroutine peuvent-ils provoquer des blocages dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-17 03:44:24
original
186 Les gens l'ont consulté

Can Unbuffered Channels in a Single Goroutine Cause Deadlocks in Go?

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)
}
Copier après la connexion

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
Copier après la connexion

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 :

  • Utiliser un canal tamponné : Créez un canal avec une taille de tampon supérieure à 0. Cela permet à l'opération de l'expéditeur de réussir même s'il n'y a pas de récepteur.
  • Exécutez le récepteur dans une goroutine séparée : Créez une goroutine distincte pour recevoir du canal. Cela garantit qu'il y a toujours un récepteur prêt à gérer la valeur de l'expéditeur.
  • Fermez le canal : Si le canal n'est plus nécessaire, fermez-le. La fermeture d'un canal débloquera toutes les opérations d'envoi ou de réception en attente.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal