Skip to main content

同步和异步的概念

同步编程模型

同步就是多个任务一个一个执行 必须第一个运行完了才能运行第二个

异步编程模型

异步就是多个任务都在执行

我们看一下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是什么