Maison > développement back-end > Golang > Comment puis-je prioriser les lectures de chaînes dans l'instruction « select » de Go ?

Comment puis-je prioriser les lectures de chaînes dans l'instruction « select » de Go ?

Mary-Kate Olsen
Libérer: 2024-12-09 10:21:06
original
802 Les gens l'ont consulté

How Can I Prioritize Channel Reads in Go's `select` Statement?

Go sélectionnez la solution de contournement de priorité de déclaration

Considérez le scénario suivant : vous souhaitez qu'une routine Go surveille deux canaux, restant bloquée lorsque les deux canaux sont vide. Cependant, lorsque les deux canaux contiennent des données, vous donnez la priorité au drainage d'un canal avant d'aborder l'autre.

Problème d'origine :

Dans l'exemple de code fourni, vous avez un canal de sortie. et un canal de sortie. Vous souhaitez que toutes les valeurs sortantes soient traitées avant de gérer le signal de sortie. Cependant, l'instruction select n'a pas de mécanisme de priorité intégré.

Solution de contournement :

Go prend en charge nativement cette priorisation, éliminant ainsi le besoin d'une solution de contournement. La solution consiste à rendre le canal d'arrêt accessible uniquement au producteur. Lorsque le producteur a terminé, il ferme le canal de sortie. Le consommateur continue de lire à partir du canal de sortie jusqu'à ce qu'il soit vide et que le canal de sortie soit fermé.

Voici à quoi ressemble le code modifié :

package main

import (
    "fmt"
    "math/rand"
    "time"
)

var (
    produced  = 0
    processed = 0
)

func produceEndlessly(out chan int, quit chan bool) {
    defer close(out)
    for {
        select {
        case <-quit:
            fmt.Println("RECV QUIT")
            return
        default:
            out <- rand.Int()
            time.Sleep(time.Duration(rand.Int63n(5e6)))
            produced++
        }
    }
}

func main() {
    vals, quit := make(chan int, 10), make(chan bool)
    go produceEndlessly(vals, quit)
    for x := range vals {
        fmt.Println(x)
        processed++
        time.Sleep(time.Duration(rand.Int63n(5e8)))
    }
    fmt.Println("Produced:", produced)
    fmt.Println("Processed:", processed)
}
Copier après la connexion

Explication :

Dans le code modifié, seule la goroutine du producteur a accès au canal de sortie. Lorsque le producteur a terminé, il ferme le canal de sortie. La goroutine du consommateur continue de lire à partir du canal de sortie jusqu'à ce qu'il soit vide et que le canal de sortie soit fermé. Cela garantit que toutes les valeurs de sortie sont traitées avant la sortie du consommateur.

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