原文连接: 并发与并行的区别
如今咱们都说设计可并行、高并发的程序,并且咱们不少时候会在潜意识里以为本身对并行(Parallelism)和并发(Concurrency)的区别很清楚,但若是要明确的说出两者的区别,又感受没办法给出一个很是清晰的描述。golang
那么什么是并发?什么又是并行呢?并行的概念比较简单,并行老是和执行(executions)相关,不少东西同时执行就是并行;而并发则是经过一些方式组织你的程序,让它能够分红多个模块去独立的执行。并行必然是须要多核的,一个处理器是没法并行的;但并发和处理器并无什么必然联系,在一个处理器上面,咱们的程序也能够是并发的。segmentfault
举个简单的例子,华罗庚泡茶,必须有烧水、洗杯子、拿茶叶等步骤。如今咱们想尽快作完这件事,也就是“一共要处理不少事情”,有不少方法能够实现并发,例如请多我的同时作,这就是并行。并行是实现并发的一种方式,但不是惟一的方式。咱们一我的也能够实现并发,例如先烧水、而后不用等水烧开就去洗杯子,因此经过调整程序运行方式也能够实现并发。浏览器
若是你以为以上的讲解仍是太抽象了,下面经过一个小故事来说解,故事原型来自 Go 语言创始人之一 Rob Pike 的一篇演讲。微信
故事的开始有一个需求:有一群地鼠要把一堆废弃的说明书用小推车推到火炉去烧毁。网络
刚开始只有一只地鼠,使用一辆推车,将书装到车上,运输到火炉旁,将书卸到火炉。完成任务必然须要比较长的时间。并发
此时若是再增长一只地鼠,那也没什么用,由于一只地鼠在干活,另外一只地鼠只能等待。(固然有人说两只地鼠轮流使用一辆推车,这样可让地鼠获得休息,这样它们干活更快,也能够提升效率。)ide
再找一辆推车来,两只地鼠分别使用各自的推车,将书装到车上,运输到火炉旁,将书卸到火炉。这样会提升运输效率,但它们会在装书和卸书时进行排队,下降了效率。高并发
这样虽然比以前快了,但仍是有瓶颈的。由于书只有一堆,火炉也只有一个,因此咱们还必须经过消息来协调两只地鼠的行动。好吧,那咱们再把书分红两堆,再增长一个火炉。post
这样就比以前的效率高差很少一倍了。如今这个模型就是并发的,由于两只地鼠能够独立完成一件事了,这样提升了运输效率,并且在装书和卸书时不会进行排队,提升了装卸的效率。但这个模型不必定是并行的,好比同一时刻可能只有一只地鼠在干活。性能
上面就是第一种并发模型,咱们还能够设计更多的并发模型,继续看漫画。
此次找了 3 只地鼠,一只负责把书装到车上,一只负责运输,一只负责把书卸到火炉焚烧。每只地鼠作一个独立的任务,固然三只地鼠之间须要使用一些诸如消息通讯之类的手段进行协调。
装书和烧书的两只地鼠都很轻松,负责运输的这只地鼠却很累,系统出现了瓶颈。那咱们再找一只地鼠来,专门负责运回空推车。
咱们在一个已有的设计(指三个地鼠的那个设计)中添加一个并发的步骤(第四只地鼠)加强了系统的性能。这样一来,两只地鼠去搞运输,若是协调的好,理论状况下工做效率将是一只地鼠的 4 倍。
总共有 4 个并发的步骤:
能够再增长一个分组,将这个并发模型并行化。
下面咱们再来看另一种并发模型。负责运输的地鼠抱怨说运输路程太长,那咱们就增长一个中转站。
而后再增长一个分组,将这个并发模型并行化,两个分组并行执行。
能够把上面的并发模型再改进一下。增长中转站的同时,再增长两只地鼠,一只负责将从书堆运过来的书卸到中转站,另外一只负责将书从中转站装到推车里,再让后面的地鼠运输到火炉旁。
而后再增长一个分组,将这个并发模型并行化。
漫画到这里就结束了,总共介绍了三种并发模型,每种模型均可以很容易地并行化。能够看到上面的并发模型每改进一次,其实就是将任务拆的更细了,一旦分解了问题,并发就天然而然产生了,每一个人只专一于一个任务。
回到程序中,书就表明着数据,地鼠就是 CPU,而车可能就是序列化、反序列化、网络等设施,火炉就是代理、浏览器或其余的消费者。而上面的并发模型就是一个可扩展的 Web Service。
该演讲题目为《Concurrency is not Parallelism》
,原文连接:
参考连接
扫一扫下面的二维码关注微信公众号,在公众号中回复◉加群◉便可加入咱们的云原生交流群,和孙宏亮、张馆长、阳明等大佬一块儿探讨云原生技术