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) }
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!