Go Language : sélection simultanée sur des canaux tamponnés et non tamponnés
La tâche à accomplir est de réaliser une sélection simultanée sur un canal d'envoi tamponné et un canal de réception sans tampon sans consommer constamment les ressources du processeur. Ce scénario équivaut à bloquer jusqu'à ce qu'un canal soit prêt à envoyer sans transmettre aucune donnée.
Pour résoudre ce problème, nous pouvons utiliser une instruction select avec un cas par défaut. Lorsqu'aucun canal n'est prêt, le cas par défaut est déclenché, déclenchant une brève durée de veille. Cela permet de conserver les ressources tout en permettant des tentatives continues d'envoi et de réception de données :
<code class="go">package main import ( "fmt" "time" ) func valueToSend() int { // Generate a value to send, calculated/acquired each attempt return 0 } func main() { s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() // Updated value for each send attempt select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // None of the channels are ready time.Sleep(time.Millisecond * 1) } } }</code>
Il faut faire preuve de prudence lorsque l'on se fie à la longueur du canal ou aux contrôles de capacité avant d'envoyer ou de recevoir des données. De telles approches peuvent conduire à un comportement inattendu, car l'état du canal peut changer entre la vérification et l'opération d'envoi/réception réelle.
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!