golang的緩衝channel和無緩衝channel的區別

話說golang的channel同步的定義真是讓人無力吐槽,碼農的用戶體驗就這麼難搞麼,超耐磨阿,無緩衝和緩衝竟然有這麼大區別。。。。靠golang

 

轉載一段網上的資料測試

--------------------------------------------------------------------------------------------------------------------------------------------------------code

golang channel 有緩衝 與 無緩衝 是有重要區別的blog

我以前天真的認爲 有緩衝與無緩衝的區別 只是 無緩衝的 是 默認 緩衝 爲1 的緩衝式同步

實際上是完全錯誤的,無緩衝的與有緩衝channel有着重大差異it

那就是一個是同步的 一個是非同步的class

怎麼說?好比test

c1:=make(chan int)        無緩衝import

c2:=make(chan int,1)      有緩衝用戶體驗

c1<-1                            

無緩衝的 不單單是 向 c1 通道放 1 而是 一直要有別的攜程 <-c1 接手了 這個參數,那麼c1<-1纔會繼續下去,要否則就一直阻塞着

而 c2<-1 則不會阻塞,由於緩衝大小是1 只有當 放第二個值的時候 第一個還沒被人拿走,這時候纔會阻塞。

打個比喻

無緩衝的  就是一個送信人去你家門口送信 ,你不在家 他不走,你必定要接下信,他纔會走。

無緩衝保證信能到你手上

有緩衝的 就是一個送信人去你家仍到你家的信箱 轉身就走 ,除非你的信箱滿了 他必須等信箱空下來。

有緩衝的 保證 信能進你家的郵箱

 

看測試代碼

有緩衝的

 1 package main
 2 
 3 import "fmt"
 4 
 5 var c = make(chan int, 1)
 6 
 7 func f() {
 8 
 9     c <- 'c'
10 
11     fmt.Println("在goroutine內")
12 }
13 
14 func main() {
15     go f()
16 
17     c <- 'c'
18     <-c
19     <-c
20 
21     fmt.Println("外部調用")
22 }

 

無緩衝的

// pp
package main

import (
    "fmt"
)

func writeRoutine(test_chan chan int, value int) {

    test_chan <- value
}

func readRoutine(test_chan chan int) {

    <-test_chan

    return
}

func main() {

    c := make(chan int)

    x := 100

    //readRoutine(c)
    //go writeRoutine(c, x)

    //writeRoutine(c, x)
    //go readRoutine(c)

    //go readRoutine(c)
    //writeRoutine(c, x)

    go writeRoutine(c, x)
    readRoutine(c)

    fmt.Println(x)
}
相關文章
相關標籤/搜索