2015-04-22 109 views
-2

我經歷了一系列的定義來找出緩衝區是如何工作的,但我只是不明白。下面是一個例子,我改變了緩衝區的值,但我不知道它的作用。有人可以根據這個例子向我解釋它,並提供一些測試案例來說明它的工作方式/原因。謝謝。通道緩衝區如何工作?

package main 

import (
    "fmt" 
    "time" 
) 

func send(out, finish chan bool) { 
    for i := 0; i < 5; i++ { 
     out <- true 
     time.Sleep(1 * time.Second) 
     fmt.Println("Fin d'une écriture") 
    } 
    finish <- true 
    close(out) 
} 
func recv(in, finish chan bool) { 
    for _ = range in { 
     fmt.Println("Fin d'une lecture") 
     time.Sleep(10 * time.Second) 
    } 
    finish <- true 
} 
func main() { 
    chanFoo := make(chan bool, 3) 
    chanfinish := make(chan bool) 
    go send(chanFoo, chanfinish) 
    go recv(chanFoo, chanfinish) 
    <-chanfinish 
    <-chanfinish 
} 
+1

我不太明白你在問什麼。在[頻道規格](http://golang.org/ref/spec#Channel_types)中有沒有你不明白的地方?特別是關於容量的段落 – JimB

+0

@JimB我不理解緩衝區部分!這是如何影響輸出的?! – Backhand

+0

和我確實訪問該鏈接之前,沒有真正幫助我 – Backhand

回答

2

如果頻道沒有緩衝區,則一次只能發送一個項目。這意味着在其上發送的代碼將會阻塞,直到某個接收者從通道中讀取該項目。這是一個人爲的例子; https://play.golang.org/p/HM8jdIFqsN 包主要

import (
    "fmt" 
) 


func main() { 
    blocker := make(chan bool) 
    nonBlocker := make(chan bool, 5) 

    for i := 0; i < 5; i++ { 
     nonBlocker <- true 
     fmt.Println("We keep going") 
    } 

    go func() { 

    for i := 0; i < 5; i++ { 
     blocker <- true 
     fmt.Println("We block cause that channel is full") 
    } }() 

} 

還有很多其他的事情,我可以做些什麼來證明相同,但其基本思路是,如果你通過一個通道進入一些夠程和頻道不進行緩衝,這將在該夠程頻道將阻止,直到收到它發送的項目。使用緩衝通道,只要緩衝區未達到容量,就可以發送。基本上,如果你啓動正在工作並返回結果的例程,並且它們比產生它們的代碼移動得更快,那麼可能需要使用緩衝通道來打開該瓶頸。

編輯:如果它仍然不明顯發生了什麼看這個; https://play.golang.org/p/9SXc4M1to4

package main 

import (
    "fmt" 
) 


func main() { 
    blocker := make(chan bool) 
    nonBlocker := make(chan bool, 5) 

    for i := 0; i < 5; i++ { 
     nonBlocker <- true 
     fmt.Println("We keep going") 
    } 

    go func() { 

    for i := 0; i < 5; i++ { 
     blocker <- true 
     fmt.Println("Now we see this cause the reciever keeps opening the channel up again!") 
    } }() 

    for i := 0; i < 5; i++ { 
     <-blocker 
    } 
} 
+0

非常感謝你,我現在明白了!我覺得最讓我困惑的是兩間公寓之間的時間!謝謝 – Backhand

+0

@Backhand np,很高興我能幫上忙。 – evanmcdonnal