线程,进程,协程, 并发,并行,同步,异步概念解析

我相信线程,进程,协程,并发,并行,同步,异步这几个概念大家在编程过程中肯定会遇到,但是偏偏这几个概念又那么类似,很容易让人模糊,今天我就用这一篇文章来和大家梳理一下这几个概念 。
1. 同步与异步

  • 当我们 同步 的执行某个任务时,我们需要等到这个任务执行完给我们反馈结果,我们才能去执行其他的任务 。
  • 但是 异步 的执行某个任务时,我们可以不用等这个任务结束就去执行另一项任务 。就像常用到的异步刷新操作 。通过异步执行的任务执行结束后我们可以通过 回调函数 获得结果 。
我们可以明显的看出同步和异步的差别,那异步操作那么好为什么不都使用异步操作呢?同步操作存在的意义是有些任务必须是 按顺序执行 的,就像我们去银行取钱,最起码的保证你的银行账户里有钱你才能取,要不然岂不是去抢银行了:full_moon_with_face: 。
2. 并发与并行2.1 并发 Concurrency咱们用做早饭来举例,例如说你还没起床,你的女朋友已经早早的起来了,在厨房给你准备早饭,她想给你做一份面包片和煎蛋,她为了能让你尽快的吃上早饭,开了两个锅,一个锅用来煎蛋,一个锅用来煎面包片,但是她为了食物尽可能美味,只能看一下煎蛋的锅,在去看一下烤面包片,这样 每个锅看一分钟,来回切换 ,这样终于把面包片和煎蛋做好了,这时你也睡醒了,吃到了美味的早餐 。
你女朋友的这个做早饭的流程就是并发操作,因为她不可能同时将注意力放在两个锅上,只能通过逐渐切换注意力的方式来使任务很好的完成 。但是如果你的女朋友可以在两个锅之间切换的足够快:joy:,在旁边看起来就像是她在同时操作两个锅。
2.2 并行 Parallelism咱们还是用做早餐为例,现在你和你的女朋友在一起已经很久了,她再也受不了天天早上给你做饭的日子了,所以今天早上她把你也拽起来和她一起做饭 。同样还是煎面包片和煎蛋,这时你和你女朋友一份一个锅,你在准备煎蛋,你的女朋友在煎面包片,你俩就这样很和谐的做着自己的事互不干扰,很快就吃到了美味的早餐 。
你和你的女朋友同时做饭,每个人操作一个锅的方式就是并行操作 。
ps:突然将你想到了,原来自己没有女朋友。2.3 图解并发与并行假设我们有两个任务A和B,我们使用并发执行是这样的 。
线程,进程,协程, 并发,并行,同步,异步概念解析

文章插图
 
可以看到虽然A和B作为两个整体的任务但是未必会直接执行完,而是会在两个任务间来回切换 。因为cpu切换的速度实在太快了,所以我们看起来好像是A和B在同时执行,但其实在每个时间点上只有一个任务在执行 。
我们再来看一下并行的方式 。
线程,进程,协程, 并发,并行,同步,异步概念解析

文章插图
 
并行操作是指两个任务同时执行的 。
3. 进程,线程与协程3.1 进程 Process电脑中每个软件的启动就代表一个进程,就是把写的程序加载到操作系统中来执行预定好的任务 。操作系统会为进程分配相应的资源来支撑它完成任务,每个进程会分配一个唯一的PID 。
线程,进程,协程, 并发,并行,同步,异步概念解析

文章插图
 
我们这次用老王来举例,假如说老王现在想盖个房子,我们就可以把盖房子这件事作为一个任务,而老王就是负责这个任务的进程 。
3.2 线程 Thread线程是进程的执行实例,是一个程序执行的最小单元,每个进程里的任务会有线程去具体执行 。
线程,进程,协程, 并发,并行,同步,异步概念解析

文章插图
【线程,进程,协程, 并发,并行,同步,异步概念解析】 
我们还是继续说老王,现在盖房子这个任务已经确定下来了,但是他发现自己不会盖,要请个工人来盖房子,于是他去外面请了一个工人A,这个工人A要做搬砖和搬木头的工作,此时这个工人A就是一个 进程 ,老王还要求他这两个任务不能差距太大,要同步进行,所以这个工人A只能搬一趟转头,搬一趟木头,这样的操作就是 单线程的并发操作

干了两天,工人A不高兴了干的活太多了要加钱,这时老王一看一个人干也确实慢,就去外面又请了一个工人B,此时工人B也就对应着一个 线程 ,老王让工人A继续搬砖,而工人B来负责搬木头,这样两个任务就能同时进行了,这就是 多线程的并行操作  。而且此时工人A和工人B是同时 共享着老王提供的资源  。


推荐阅读