并发不是并行
一.前言
日常学习~看一看 go 语言的大佬是如何解释并发和并行的~
二.正文
2.1 定义
并发(Concurrency)
编程作为独立执行进程的组合。
并行(Parallelism)
编程作为(可能相关的)计算的同时执行。
2.2 并发中的通信
由于并发将程序分解成可以独立执行的片段来构建程序的方法,所以各个独立片段之间需要进行通信,go 语言的通信哲学是基于通信顺序进程(Concurrency plus communication)。
2.2.1 问题
假设我们有一堆砖,需要地鼠搬运,我们应该如何设计搬运方式。
2.2.1.1 模型设计 1
设计多个地鼠,多个车,多个焚化炉,让多个地鼠之间的搬运独立,如果数目是 2,消费生产的速度就是原先的 2 倍。
这个设计是并发的,但并不一定是并行的,因为不能保证 2 只地鼠同时工作,可能只有一个在工作。
2.2.1.2 模型设计 2
第二种模型将运送书籍去焚毁的这个流程分成了四种不同的独立执行片段,片段之间通过通信交互
1.将书籍装车
2.运送书籍到焚化炉
3.烧书
4.返回空购物车
在一切理想的情况下,会比最开始的单地鼠设计快四倍。(单地鼠烧一本书,需要装书,运输,烧书,运车回来,如果有四个 cpu,此操作在运输中可以每个地鼠就做自己的事情,所以速度快 4 倍)
我们通过在现有设计中添加并发过程来提高性能,更多地鼠做更多的工作,这是单纯增加并行的另一种理解。
该方案保证了在并行与不并行两种场景下都能正确运行的能力。
2.2.1.3 模型设计 3
在书堆和焚烧炉之间再放置一片缓存,一部分地鼠将书搬运到中间,一部分地鼠把中间的书搬运到焚烧炉,并发性更高了,我们可以将一个问题以各种不同的方式分解,有各种不同的运行模式。
2.2.1.4 转换到计算机看
书堆 => 网页内容
地鼠 => CPU
购物车 => 编组、渲染或联网
焚化炉 => 代理、浏览器或其他消费者
它成为可扩展 Web 服务的并发设计。
2.2.2 总结
并发是有关结构的,它是一种将一个程序分解成多个小片段并且每个小片段都可以独立执行的程序设计方法;并发程序的小片段之间一般存在通信联系并且通过通信相互协作。
并行是有关执行的,它表示同时进行一些计算任务。
通过设计不同模式的并发方式可以做到优化代码执行的目的。
三.学习文档
演讲视频:
https://talks.golang.org/2012/waza.slide#11
演讲 ppt
https://talks.golang.org/2012/waza.slide#24
四.引申学习
select 基本原理
闭包优越性
评论