Maison  >  Article  >  développement back-end  >  Comment sélectionner efficacement les canaux d'envoi avec tampon et de réception sans tampon dans Go ?

Comment sélectionner efficacement les canaux d'envoi avec tampon et de réception sans tampon dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 17:51:29606parcourir

How to Efficiently Select on Buffered Send and Unbuffered Receive Channels in Go?

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!

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