同步和异步的概念
同步编程模型
同步就是多个任务一个一个执行 必须第一个运行完了才能运行第二个
异步编程模型
异步就是多个任务都在执行
我们看一下JS是如何实现的 比如下面这段代码
new Promise(urla)new Promise(urlb)new Promise(urlc)
上面这段代码是一段伪代码,代表三个任务 请求urla urlb urlc。 虽然三个url请求是一个一个请求的 (你可以想象一下相当于顺序开启了三个线程 虽然不是很准确) 但是url请求的实际工作是各自分开进行的,互不影响。
如果上面的代码在浏览器中执行,实际上底层应该只有一个CPU Core 但是三个任务的代码确实是都在执行了,这就是基于划分CPU时间片原理的并发
CPU一会运行任务A 一会运行任务B 一会运行任务C 确实是同时执行了 即使urla的请求还没有完成(还没有收到相应),但是不影响我接着请求urlb urlc🐕
但是需要注意的是 在任意时刻 核心只能执行其中的一个任务 b请求和c请求 并不需要等待a的返回 所以nodejs相当于用一个线程就实现了异步编程模型 这样的好处是没有CPU上下文切换的开销 也不需要处理共享资源竞争的问题(这是个很复杂的问题而且很棘手!!)
关于并行和并发
并行
多个CPU core 同时运行
并发
CPU core以切换时间片的方式并发执行多个任务
注意 这里的语境是对于CPU来说的 很显然,并发在不同的语境下有不同的涵义
在web系统中,高并发是另外一个含义了 所以一定需要注意 同一个词语在不同的语境 也就是context下 有不同的含义 所以当我们在讨论一个概念的时候 一定需要明确我们的背景和Context是什么