分享
  1. 首页
  2. 文章

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

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

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

无闻说缓冲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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏