109 votes

Quelle est la taille de la mémoire tampon du canal ?

J'essaye de créer un canal asynchrone et j'ai regardé http://golang.org/ref/spec#Making_slices_maps_and_channels .

c := make(chan int, 10)         // channel with a buffer size of 10

Qu'est-ce que cela signifie que la taille du tampon est de 10 ? Que représente/limite spécifiquement la taille de la mémoire tampon ?

202voto

Kevin Ballard Points 88866

La taille du tampon est le nombre d'éléments qui peuvent être envoyés au canal sans que l'envoi ne soit bloqué. Par défaut, la taille de la mémoire tampon d'un canal est de 0 (vous l'obtenez avec la commande make(chan int) ). Cela signifie que chaque envoi bloquera jusqu'à ce qu'une autre goroutine reçoive du canal. Un canal avec une taille de tampon de 1 peut contenir 1 élément jusqu'à ce que l'envoi bloque, donc vous obtiendriez

c := make(chan int, 1)
c <- 1 // doesn't block
c <- 2 // blocks until another goroutine receives from the channel

21voto

Vladimir Bauer Points 194

Le code suivant illustre le blocage d'un canal non tamponné :

// to see the diff, change 0 to 1
c := make(chan struct{}, 0)
go func() {
    time.Sleep(2 * time.Second)
    <-c
}()
start := time.Now()
c <- struct{}{} // block, if channel size is 0
elapsed := time.Since(start)
fmt.Printf("Elapsed: %v\n", elapsed)

Vous pouvez jouer avec le code aquí .

2voto

user2480972 Points 21
package main

import (
    "fmt"
    "time"
)

func receiver(ch <-chan int) {
    time.Sleep(500 * time.Millisecond)
    msg := <-ch
    fmt.Printf("receive messages  %d from the channel\n", msg)
}

func main() {
    start := time.Now()
    zero_buffer_ch := make(chan int, 0)
    go receiver(zero_buffer_ch)
    zero_buffer_ch <- 444
    elapsed := time.Since(start)    
    fmt.Printf("Elapsed using zero_buffer channel: %v\n", elapsed)

    restart := time.Now()
    non_zero_buffer_ch := make(chan int, 1)
    go receiver(non_zero_buffer_ch)
    non_zero_buffer_ch <- 4444
    reelapsed := time.Since(restart)
    fmt.Printf("Elapsed using non zero_buffer channel: %v\n", reelapsed)
}

résultat :

recevoir les messages 444 du canal

Temps écoulé en utilisant le canal zéro_buffer : 505.6729ms

Temps écoulé en utilisant un canal non zéro_buffer : 0s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X