Day8 - 读 Concurrency is not Parallelism - Rob Pike (三)

续上篇,Day7 - 读 Concurrency is not Parallelism - Rob Pike (二),继续昨天的 gopher 烧书:

想出了一种 gopher 烧书的方式之後。当我们了解到可以将一个问题拆解成几个相依的 process,我们当然能想出另一种解决烧书问题的方式:一个 gopher 把书放到推车上,一个 gopher 将推车推到焚化炉并且把空的推车推回,一个 gohper 负责烧书。

这样的设计会变快,但可能不会快多少,如果中间那只 gopher 的路途很长时,其他两只 gopher 可能没事做 (左边的 gopher 已经把书叠完,右边的 gopher 已经把书烧完),那就多来一支 gopher 将空的车运回来。这其实就是另一种 concurrent 设计,而且我们将 gopher 烧书这件事,拆解的更细了。可以想像若这四只 gopher 烧书如果设计的良好,可能会比本来一支 gopher 烧书还要快四倍。

藉由这次的观察,得到一个结论,藉由加了一个 gopher 之後,烧书这件事情效率就上升了。当然加了一个 gopher 做事情效率上升,这事情很直觉,但是把加 gopher 这件事情想成多加了一个设计,效率就上升了,这件事是蛮神奇的。这种拆解问题的方式 (也就是 concurrent design) 不单单只是 parallel 这麽简单而已。

这四只 gopher,一只把书放进推车,一只烧书,一只将书卸载,一只将推车返回。你可以把这想成四个不相依的 process,并且各自运作良好,将它们组合後就能解决烧书的问题。
https://ithelp.ithome.com.tw/upload/images/20210909/20140148nOaX0zpBgu.png

当然刚刚的解法也不是唯一的,重点是,当我们将问题拆解 (concurrent decompostion) 之後,就可以在不同的维度上平行化。
https://ithelp.ithome.com.tw/upload/images/20210909/20140148e1I8F6HQDu.png

这时候 Rob Pike 说了一句:也许这也可以不是一个 parallel 的状态啊,这些 gopher 不一定要同时忙碌。
在同一个时间,可能只有一个 gopher 在忙碌,其他七个闲置,但真正的重点是:尽管只有一只 gopher 工作,这个设计仍然是正确的且运作良好。这代表我们不需要担心 parallelism ,当我们做出了一个良好的 concurernt 设计,parallel 其实就是一个挑选几只 gopher 在忙碌 free variable 的参数而已。
https://ithelp.ithome.com.tw/upload/images/20210909/20140148z7eoVsN9AJ.png

接下来,再来看看一个新的设计吧,一只 gopher 将书堆运到中间,另一只则从中间的书堆运到焚化炉。
https://ithelp.ithome.com.tw/upload/images/20210909/20140148hkrzRSgBGk.png

来一点平行化吧,直接复制一组两只 gopher 烧书的方式:
https://ithelp.ithome.com.tw/upload/images/20210909/20140148Md9YxJiq9L.png

还记得,我们刚刚将烧书拆成四个 gopher 去做吗 (堆书,推车,返回空车,烧书),我们将同样的概念在用在这里:
https://ithelp.ithome.com.tw/upload/images/20210909/201401488zbRvm2VgL.png

当然,我们也能直接复制一组,变成 16 只 gopher 来运作:https://ithelp.ithome.com.tw/upload/images/20210909/20140148Wcenuk97qx.png

从这几个设计的演化可以学到,

  1. 拆解问题的方法很多种 (也就是 concurrent 的设计有很多种)。
  2. 刚刚的设计过程,就是 concurrent desing 的过程了。
  3. 当我们把问题拆解之後,parallel 就自然会出现拉,而且运作是良好且正确的
    https://ithelp.ithome.com.tw/upload/images/20210909/201401480ubSi5BTB9.png

最後我们把这些事情做个替换,书堆换成网页内容,gohper 换成 cpu,推车换成渲染、marshaling 或是网路,焚化炉换成浏览器或是代理服务器等等,这其实就是一个可扩展的 web 服务的 concurrent 设计
https://ithelp.ithome.com.tw/upload/images/20210909/20140148WTLjvACKcS.png

明日继续读


<<:  [Day 3] Leetcode 848. Shifting Letters (C++)

>>:  【D8】制作图表:三大法人-区分期货与选择权二类

Day25-D3 基础图表:折线图+ d3.bisector( )与 d3.defined( )

本篇大纲:d3.line( )、d3.bisector( )、d3.defined( )、范例图表...

<新手复习向> <CSS学习第1集/>:{简单介绍与常见属性;}

CSS是啥? 全名为(Cascading Stylesheets),谷哥中文是阶层样式表,是一种风...

Day30:今天来聊一下CEH中讲的Mail Cryptography

电子邮件加密通过将电子邮件内容加密为不可读的形式来隐藏窃听者电子邮件内容。 电子邮件可以通过使用公钥...

[ Day 29 ] 实作一个 React.js 网站 5/5

今天是实作 React.js 网站的最後一篇介绍了,这篇会大量的使用到 React Hooks 的...

[Day 13] 非同步的操作资料库?谈 suspendedTransactionAsync

前面我们聊到了如何存取资料库,以及遇到 N+1 问题时该如何发现以及解决问题。 今天我们来谈谈 Ex...