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

铂金便便 · · 3045 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

无闻说缓冲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基础教程中并发相关的概念有错误

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3045 次点击  
加入收藏 微博
2 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传