
看一下效不雅(复制链接 http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong2.html 到浏览器中打开)


建议在PC端浏览器上打开膳绫擎的链接,可以和 WebGL 动画交互,玩玩看。你可以放慢、加快,大年夜不合的角度不雅察它。
三个玩家
膳绫擎是常见的2个乒乓球活动员对打的过程,如不雅是三个活动员会是什么样呢?如今,让我们来运行 3 个活动员的尝尝看。代码中只要做少量的修改,添加一个 player 即可:

效不雅如下:(复制链接 http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong3.html 到浏览器中打开)

让我们看一个更复杂的例子,跑36个活动员看看。

效不雅(复制链接http://talks.bingohuang.com/2017/go-concurrency-visualize/pingpong36.html 在浏览器中打开)

在这里我们看到每个活动员都是轮流依次进行,你可能会想为什么是如许?为什么接球的 goroutine 会按照这么严格的次序?
谜底是因为 Go 运行时给接收者(预备大年夜特定的 channel 接收消息的 goroutines)保持一个先辈先出(FIFO)的队列,同时在我们的例子中,每一个活动员正好在他将球打到桌子上的时刻就做好预备。
经由过程关键字 go 来创建 goroutine,如下说是
4.素数筛
膳绫擎几个例子比较简单,让我们来看一个更复杂的并发算法:素数筛算法,又叫埃拉托斯特尼算法,是一种古老的算法,用于 找到小于或等于给定整数n 的素数。算法核心思惟:先用最小的素数2去筛,把2的倍数剔除掉落;下一?未清除的数就是素数(这里是3)。再用这个素数3去筛,清除掉落3的倍数... 如许赓续反复下去,直到筛完为止。

异常漂亮的算法,特别是在 3D 图像下。
这个算法的并发变更是用 goroutines 来过滤数字 —— 一个 goroutine 发明一个素数,而 channels 用来把数字大年夜 generator 传递到 filter。当一个素数被找到了,就会经由过程 channel 传递给 main,再输出。
当然,这个算法并不会异常高效,特别是在你想找大年夜量的素数,并且寻找最低的大年夜 O 复杂度时,但这个算法确异常的优雅。

大年夜家可以看一下可视化的样子(http://talks.bingohuang.com/2017/go-concurrency-visualize/primesieve.html)

可以在交互模式中体验一下该动画。它的图形化方法确切能更好的赞助我们懂得算法。该 generate 函数 goroutine 大年夜 2 开端发出每一个整数。而每一个新的 filter 函数 goroutine 会过滤特定素数的倍数 - 2,3,5,7……每一个 filter 的第一个数就是素数,将它发送给 main 函数,并输出。如不雅你扭转图像自顶向下看的话,你会发明,所有大年夜 goroutine 发送给 main 的数字就是素数。
5.其他-Goroutines 泄漏
固然说Goroutine是一个很轻量线程,不该该浪费它的。假设有 N 多个Goroutine泄漏了会怎么样?

效不雅见http://talks.bingohuang.com/2017/go-concurrency-visualize/leak.html
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 很难说进修曲线的进步会“吓走”若干人,但至少如今没有太大年夜的不满之声,iPhone X的高利润>>>详细阅读
本文标题:可视化学习 Go并发编程
地址:http://www.17bianji.com/lsqh/38725.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示