转自个人博客 chinazt.cc
先看下面一道面试题:
func main() { runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} wg.Add(20)for i := 0; i < 10; i++ { go func() { fmt.Println("go routine 1 i: ", i) wg.Done() }() }for i := 0; i < 10; i++ { go func(i int) { fmt.Println("go routine 2 i: ", i) wg.Done() }(i) } wg.Wait() }
在不执行代码的前提下,脑补一下输出结果应该是什么。
我再看到这道题时,首先想到输出应该是0 -- 9 依次输出。 但执行后才大跌眼镜,错的不是一点半点。首先看一下,在我本地执行的结果:
go routine 2 i: 9go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 1 i: 10go routine 2 i: 0go routine 2 i: 1go routine 2 i: 2go routine 2 i: 3go routine 2 i: 4go routine 2 i: 5go routine 2 i: 6go routine 2 i: 7go routine 2 i: 8
意不意外? 惊不惊喜?
为什么会是这样的结果, 再翻阅了google官方出品的golang文档之后,总算搞到了一些头绪。
并发不等于并行
golang的核心开发人员Rob Pike专门提到了这个话题(有兴趣可以看这个视频或者看原文PPT)
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26