51CTO的無聞的Go基礎教程中並發相關的概念有錯誤

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

無聞並發的課程看了下,然後給他搞暈了,冊那,我是鉑金便便啊,脾氣是很屎的,你不解釋清楚麼,我就自己去搞清楚。

無聞說緩衝channel不會阻塞,非緩衝channel會阻塞,真的是這樣嗎?

無聞本人舉了個例子

func main(){    c:=make(chan bool,1)    go fun(){        fmt.println("GO!")        <-c    }()    c<-true}

上面的代碼只要把1去掉就會輸出GO!不去掉就不會輸出GO!他說這就證明緩衝channel不會阻塞,非緩衝channel會阻塞。那好吧,便便不信邪,我來一段代碼

// testgo project main.gopackage mainimport (    "fmt"    "time")func main() {    c:=make(chan bool,1)    go func(){        fmt.Println("GO!")        <-c        fmt.Println("123!")    }()    time.Sleep(1*time.Second)    fmt.Println("111")    c<-true    time.Sleep(1*time.Second)    fmt.Println("222")    time.Sleep(2*time.Second)}

大家猜猜,輸出是咩?

GO!

111

123!

222

成功: 進程結束代碼 0.

進程goroutines在main進程建立好管道c的時候與main進程同時運行,main先sleep了1秒,首先輸出goroutines的GO!,然後從c中取對象,注意喲,是一個緩衝管道喲,按照無聞的說法應該不會阻塞喲,應該直接輸出123的喲,結果捏?馬桶堵住了!!!阻塞了!!!管道裡面沒有對象,取不出來,一直在等其他進程往管道裡面塞對象,所以說只要有管道,就是會阻塞的。我的例子裡面首先輸出的是111,等main進程把對象塞到管道裡面的時候,goroutines進程就不阻塞了,輸出123.

結論就是 緩衝channel 取不到會阻塞

最後給大家一個自己長期工作以來的忠告,不要盲目相信權威,不知道就去試一下,老師說的不一定對,還有就是自己如果真要上傳視頻教程,請先審核下,不然誤人子弟啊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.