码迷,mamicode.com
首页 > 其他好文 > 详细

51CTO的无闻的Go基础教程中并发相关的概念有错误

时间:2015-11-15 13:36:17      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

无闻并发的课程看了下,然后给他搞晕了,册那,我是铂金便便啊,脾气是很屎的,你不解释清楚么,我就自己去搞清楚。

无闻说缓冲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.go
package main

import (
    "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 取不到会阻塞

最后给大家一个自己长期工作以来的忠告,不要盲目相信权威,不知道就去试一下,老师说的不一定对,还有就是自己如果真要上传视频教程,请先审核下,不然误人子弟啊

51CTO的无闻的Go基础教程中并发相关的概念有错误

标签:

原文地址:http://my.oschina.net/icelily/blog/530489

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!