golang goroutine和channel

無buffer的chan,buffer=0的chan

從ch中取數(shù)據(jù)。
如果ch中沒有傳入數(shù)據(jù),程序?qū)⒁恢弊枞?lt;-ch這里

//無buffer的chan
ch := make(chan int)
//從ch中取數(shù)據(jù)
<-ch//如果ch中沒有傳入數(shù)據(jù),程序?qū)⒁恢弊枞谶@里

往ch中寫數(shù)據(jù)。
如果ch中沒有可以寫入數(shù)據(jù),則程序會阻塞在ch<-1這里

//無buffer的chan
ch := make(chan int)
ch<-1

有buffer的chan

只影響chan的寫入,如果chan的buffer已經(jīng)滿了(比如,chan中的數(shù)據(jù)沒有被消費(fèi)或者chan中的數(shù)據(jù)消費(fèi)比生產(chǎn)要慢),則程序會阻塞在ch<-1這里

//有buffer的chan
ch := make(chan int,2)
ch<-1
fmt.Println(1)
ch<-1
fmt.Println(2)
ch<-1//會阻塞在這里
fmt.Println(3)

無buffer的chan的發(fā)送操作總是在接受前完成(操作是指執(zhí)行順序,而不是代碼編寫順序)。

注意:close chan,<-chan將接收到chan的零值

不建議的使用方式

    end := make(chan int64, 0)
    var a int64
    go func() {
        a = <-end
        fmt.Println(999)//此行代碼很有可能無法輸出
    }()
    end <- 1
    fmt.Println(a)

因?yàn)閎uffer為0,end <- 1此行會被阻塞,直到a = <-end被執(zhí)行,一旦a = <-end被執(zhí)行,end <- 1會立刻發(fā)送數(shù)據(jù),程序執(zhí)行fmt.Println(a),執(zhí)行到這里,程序就結(jié)束了。fmt.Println(999)很大可能無法及時執(zhí)行。
如果buffer不為0,寫數(shù)據(jù)不會被阻塞,則程序立刻結(jié)束了,goroutine中的代碼很可能無法執(zhí)行。

建議的使用方式

先寫數(shù)據(jù),再讀數(shù)據(jù)。
解釋:寫數(shù)據(jù)一般可能會有時間消耗,比如寫入的數(shù)據(jù)是從cache或者db中讀取的。在goroutine中執(zhí)行耗時操作也比較合理。

    end := make(chan int64)

    go func() {
        end <- 1
    }()

    fmt.Println(<-end)

讀數(shù)據(jù)也可以在goroutine中執(zhí)行


    count := 0
    
    end := make(chan int64, 20)

    go func() {
        for i := 0; i < 10; i++ {
            end <- int64(i)
        }
    }()

    go func() {
        for v := range end {
            count++
            fmt.Println(v, count)
        }
    }()

    http.HandleFunc("/state", func(writer http.ResponseWriter, request *http.Request) {
        io.WriteString(writer, "count is "+strconv.Itoa(count))
    })
    http.ListenAndServe(":7777", nil)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,963評論 1 143
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,316評論 2 89
  • 飲茶,是清雅與世俗的完美融合,它可以讓你擺脫世俗的羈絆,回歸原來的自我。 飲茶,是手足口鼻的聯(lián)動,缺少任何一個環(huán)節(jié)...
    吾名圣燕閱讀 273評論 2 2
  • 又是一年暑假,我照常在家,家里還是那幾個人。 我想起了當(dāng)年對著電話失聲痛哭的自己,那時候我哭得崩潰,現(xiàn)在看來不過如...
    田閑閱讀 317評論 0 0
  • 今天是我的生日,一個不算很年輕的年紀(jì),一直以來,都不是很想長大,害怕承擔(dān)責(zé)任,害怕失去幻想。媽媽第一次學(xué)會...
    張遲遲閱讀 275評論 0 0

友情鏈接更多精彩內(nèi)容