Day 16 读 Go Concurrency Patterns - Rob Pike III

续上篇 Day 15 读 Go Concurrency Patterns - Rob Pike II

传话游戏 (Chinese whispers game)

传话游戏就是将原有的讯息,从第一个人透过肢体动作传给下一个人,直到传到最後一个人,并且由最後一个人猜原本的讯息到底是什麽。

接下来用 goroutine 和 channel 模拟这个传递的过程吧。

来解读一下程序:

  • 可以将每一个 gopher 当作一个 groutine
  • 对於每一只 gopher 来讲,他需要从右边接收讯息,并且把讯息传向左边,所以我们可以设计出投影片里的 f 函式,把右边的讯息 +1 传给左边代表着传话游戏渐渐失真的讯息
  • 这支程序的做法是从左到右把每个 goroutine 的 channel 连接好
  • 最两行程序则是从最右边传送讯息,从最左边接收

仔细看,这里竟然开了一万个 goroutine,执行速度还是很快,这章投影片同时想表达的是 goroutine 是很轻量的

模拟 Google search

Rob Pike 在这时表示,到现在为止做的程序都太玩具了。 Go 是用来设计系统程序的,我们来做一个简单的 google search engine 吧

先想想 google search 做了什麽:

  • 你丢一个搜寻请求,google 回应你搜寻结果
  • 我们丢出去的请求,通常会搜寻网页、Youtube、地图、新闻等等

先做出一个假的 fakeSearch 的框架,并且用它来产生各种假的搜寻,包括 Web、Image、Video

版本一,依序执行,搜寻 Web、搜寻 Image、搜寻 Video,最後再组起来


版本二,用三个 goroutine 执行,再把结果组起来。
注意:这支程序透过 channel 工具,并没用到传统的 mutex, conditional variable


仔细想想版本二会有一个问题,总执行时间会是搜寻最慢的那个 goroutine 的执行时间,若是一个 server 回传的速度非常慢,就会造成总执行时间被拖慢
版本 2.1

  • 加上 timeout 时间,若只要 search 时间超过,就不使用这个结果

注意:这程序有一个问题,如果这个搜寻很久的结果回传之後呢,因为接收端的 channel 没有人接收了,这个 goroutine 发送时就被 block ,直到程序结束,造成 goroutine leak,Rob Pike 可能写投影片时没注意到,到最後我们再看看怎麽修正吧

十二点又到啦,休息,明日继续。


<<:  [Day 01] 纲要

>>:  D15: 工程师太师了: 第8话

《莫守成规》五个叛逆特质,让你又乖又坏(?)

打破规则的五个特质,到底是会把事情弄乱?还是会让你探索事情的全貌? 「很羡慕你那种没有犯错的日子,能...

Day7 风生水起,观元辰宫的木-2

关於地板 地板的部分,也关系到了墙壁以及布线难易度,往往很多公司在装潢完成之後,才发现东缺西缺,到之...

# Day19--从Sruct、Class的本质差异论MVC

本篇内容来自於我在Medium上写的一篇文章:Swift 语法再读#1 [Between Struc...

Day 9 [Python ML、特徵工程] 分类工程

import pandas as pd from sklearn.preprocessing imp...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day11.列表渲染

当我们有很多重复的架构,内容却不一样,以旧有无框架的开发,我们可能就需要手动一笔一笔的刻出来,更进步...