Maison  >  Article  >  développement back-end  >  Comment fermer correctement le tuyau en Golang

Comment fermer correctement le tuyau en Golang

PHPz
PHPzoriginal
2023-04-06 09:11:521170parcourir

Pipeline dans Golang est une structure de données très puissante qui peut transmettre des données entre différents Goroutines et éviter les courses aux données. Cependant, lorsque l’on travaille avec des tuyaux, une question courante est de savoir comment fermer correctement le tuyau pour éviter les blocages ou les fuites.

Cet article explique comment fermer correctement les tuyaux dans Go pour éviter les problèmes courants.

  1. L'opération de fermeture du tuyau

Les tuyaux dans Go peuvent être fermés via la fonction intégrée close(). L'opération de la fonction close() est une opération unique, c'est-à-dire qu'après la fermeture du canal, aucune autre donnée ne peut être écrite dans le canal.

Par exemple :

ch := make(chan int)
close(ch)
  1. Comment savoir si un tuyau est fermé ?

Nous pouvons déterminer si le pipeline a été fermé grâce à une autre valeur de retour du pipeline. Cette valeur est une variable de type bool Lorsque le tube est fermé, sa valeur est vraie, sinon elle est fausse.

Par exemple :

ch := make(chan int)
go func() {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}()
for x := range ch {
    fmt.Println(x)
}

Dans cet exemple, nous créons un tube ch de type entier et écrivons des données dans ch dans un autre Goroutine. Dans la fonction principale, nous utilisons l'instruction range pour lire les données dans le tube. Lorsque le tube est fermé, l'instruction range arrête la boucle.

Nous pouvons également utiliser une variable supplémentaire pour déterminer si le tuyau est fermé.

ch := make(chan int)
go func() {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}()
for {
    x, ok := <-ch
    if !ok {
        break
    }
    fmt.Println(x)
}

Dans cet exemple, chaque fois que nous lisons les données du tube, nous vérifions également la valeur de retour booléenne suivante ok. Si la valeur de ok est fausse, le pipeline a été fermé.

  1. Comment fermer les canalisations en toute sécurité ?

Lors de l'utilisation de pipelines, nous devons parfois fermer le pipeline dans certains états spécifiques pour éviter un blocage ou une fuite du programme. Par exemple, dans un pipeline partagé entre plusieurs Goroutines, une Goroutine peut devoir fermer le pipeline en toute sécurité après la sortie de toutes les autres Goroutines.

À ce stade, nous pouvons utiliser un Goroutine supplémentaire pour détecter si le pipeline est fermé en toute sécurité. Cette détection Goroutine peut envoyer un signal de notification au pipeline, et lorsque tous les autres Goroutines sont sortis, le pipeline peut être fermé.

Par exemple :

ch := make(chan int)
done := make(chan bool)

go func() {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    done <- true
}()

go func() {
    <-done
    close(ch)
}()

for x := range ch {
    fmt.Println(x)
}

Dans cet exemple, nous utilisons un tube terminé pour notifier la coroutine d'arrêt. Le premier Goroutine écrit des données dans le tube Lorsque toutes les données sont écrites, il envoie un vrai signal au tube terminé. Le deuxième Goroutine ferme le tuyau ch après avoir reçu le signal dans le tuyau terminé.

  1. Résumé

Lorsque vous utilisez des tuyaux, veillez à les fermer correctement. La fermeture des tuyaux garantit la sécurité de la mémoire et les performances du programme. Nous devons utiliser la méthode correcte pour détecter si le tuyau est fermé et utiliser la détection Goroutine pour signaler qu'il faut fermer le tuyau en toute sécurité en cas de besoin.

Une utilisation appropriée des tuyaux peut apporter des performances et une fiabilité très élevées, rendant nos programmes plus robustes. Dans le même temps, nous devons également prêter attention aux scénarios applicables aux pipelines, et il ne faut pas abuser des pipelines pour résoudre des problèmes.

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!

Déclaration:
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