2012-08-13 7 views

Antwort

110

Die Puffergröße ist die Anzahl der Elemente, die ohne Send-Blocking an den Kanal gesendet werden können. Standardmäßig hat ein Kanal eine Puffergröße von 0 (Sie erhalten diese mit make(chan int)). Dies bedeutet, dass jeder einzelne Sendevorgang blockiert wird, bis eine andere Goroutine vom Kanal empfangen wird. Ein Kanal von Puffergröße 1 kann 1 Element halten blockiert, bis das Senden, so würden Sie

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

Gute Antwort. Effective Go hat ein schönes Kapitel mit dem Titel "Concurrency", das sich auf Kanäle ausdehnt. Sehr zu empfehlen: http://golang.org/doc/effective_go.html – Levi

+0

Ich bin damit beschäftigt und make (chan int, 1) erlaubt 3 Werte in meinem Kanal vor dem Blockieren (testet es mit log.Printlns), und der Standardwert ist 2 in, bevor blockiert wird. Irgendeine Idee warum: – Mauricio

+0

@Mauricio Das klingt ziemlich komisch. Ich habe gerade Go 1.8.3 lokal getestet und auch die "Try Go" -Funktionalität unter https://golang.org verwendet, und in beiden Fällen verhält es sich immer noch wie in meiner Antwort dokumentiert. –

2

Der folgende Code zeigt die Blockierung von ungepufferten Kanal erhalten:

// 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) 

Sie können mit dem Code spielen here .

Verwandte Themen