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


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

 

轉載一段網上的資料

--------------------------------------------------------------------------------------------------------------------------------------------------------

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

我之前天真的認為 有緩沖與無緩沖的區別 只是 無緩沖的 是 默認 緩沖 為1 的緩沖式

其實是徹底錯誤的,無緩沖的與有緩沖channel有着重大差別

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

怎么說?比如

c1:=make(chan int)        無緩沖

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM