Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践
效不雅如下图(复制链接 http://talks.bingohuang.com/2017/go-concurrency-visualize/helloworld.html 在浏览器中打开也可直接拜访):
并行&并发
想懂得并行和并发的差别,推荐看一下Rob Pike的分享(点击浏览原文即可跳转)。在这个视频里,他用形象的Gopher动图,讲解了Go并发的过程。
因为今天的重点不是讲理论,而是站在可视化的角度来展示并发的过程。所以,结合这两个可视化图形可以直不雅的懂得并发和并行的差别,毕竟一图胜千言。(请复制链接在浏览器中打开)
并发:http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong36.html
36个玩家
并行:http://talks.bingohuang.com/2017/go-concurrency-visualize/parallelism.html
总的来说,并行就是同时履行(平日是相干的)计算义务的编程技巧,两个或者多个事宜在同一时刻产生;而并发是将互相自力的履行过程综合到一路的编程技巧,两个或多个事宜在同一时光距离内产生。
为什么要存眷并发?
当今是多核的时代,并发的世界。摩尔定律逐渐掉效,须要更多存眷并发的编程思惟。
但并发编程并不轻易,而 Go 对并发有很好的支撑。
Go 说话中的并发
Goroutine - 并发履行
- 类似于 UNIX 中的 &
- 很像线程,但更轻量
- 一个 goroutine 就是一个自力运行的函数
- 当一个 goroutine 壅塞时,地点的线程会壅塞,但其它 goroutine 不受影响
Channel
- 类似于 UNIX 中的管道
- 它许可在 Goroutine 之间传递消息
但问题来了:
- 我们如何去讲解 Go 的并发?
- 我们如何思虑 Go 的并发过程?
- 最终,我们如何更好的实践 Go 并发编程?
- 这里祭出一个法宝——GoTrace,它是一个能将 Go 并发过程可视化的开
- gotrace(go):分析 go tool trace 的履行结不雅
- gothree(js): 基于 ThreeJs 和 WebGL 生成 3D 图像
如下有一个简单的例子,这是常见的急鹞鲼,后续还可以做成可视化的图形。
Select
- 类似于说话中常见的 switch
- 但它的断定前提是基于通信,而不是基于值的等量匹配
Go让并发编程变得简单起来
感激 divan 大年夜神 供给了这款对象和不少 Go 并发模式的素材。
耳听为虚,目击为实
1.Hello,World!
无论写什么竽暌癸言,都邑大年夜 hello world开端,代码异常简单 - 单 channel,单 goroutine,一次写,一次读。
这里蓝色的线表示 goroutine 跟着时光运行。细的蓝线连接了 ‘main’ 和 ‘#20’,标记住 go routine 的启动和停止,揭示了它们的父子关系。最后,红色箭头给我们展示了‘发送/接收’的动作。实际上它是两个自力的动作,我试着用动画展示成一个零丁的事务:大年夜 A 发送到 B。 Goroutine 名称中的的 “#20”,是实际的 goroutine 内部 ID,经由过程某种手段大年夜运行时获取。
2.急鹞鲼
记得在前面讲Channel举的一个急鹞鲼的例子,也异常典范 - 创建一个 channel,启动一个 goroutine,在给定的时光距离之后向这个 channle 写入数据,之后将这个 channel 返回给函数的调用着。这个调用者会壅塞固定的时光后去攫取该 channel。让我们来运行 24 个如许的急鹞鲼测验测验着做可视化。
看一下效不雅(复制链接http://talks.bingohuang.com/2017/go-concurrency-visualize/timer.html ):
异常的形象,是不是?
3.兵乓球
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 很难说进修曲线的进步会“吓走”若干人,但至少如今没有太大年夜的不满之声,iPhone X的高利润>>>详细阅读
本文标题:可视化学习 Go并发编程
地址:http://www.17bianji.com/lsqh/38725.html
1/2 1