js-聊聊并行与串行、同步与异步、阻塞与非阻塞

319 阅读3分钟

1、异步、阻塞等概念

  1. 老王把普通水壶放到火上,站着等水开。(同步阻塞)
  2. 老王把普通水壶放在火上,去客厅看电视,时不时去厨房看水开没有开。(同步非阻塞)
  3. 老王把响水壶放在火上,站着等水开。(异步阻塞)
  4. 老王把响水壶放到火上,去客厅看电视,水壶响之前,不用再去看它,等响了再去拿壶。(异步非阻塞)

这里的同步异步,是对于水壶来说的。
普通水壶是同步,响水壶是异步。响水壶可以在烧开后,发出声响提示老王,但是普通水壶则不行,需要老王亲自来多次(轮询)查看;
这里的阻塞非阻塞,是对于老王来说。
站着等着的老王是阻塞,而看电视的老王是非阻塞。

详细解释

  • concurrency: 并发(无论上一个开始执行的任务是否完成,当前任务都可以开始执行)
  • parallel : 并行 (有多个任务执行单元,从物理上就可以多个任务一起执行)
  • synchronous : 同步 (就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。同步是按照顺序一个一个来,不会乱掉,更不会出现上面代码没有执行完就执行下面的代码)
  • asynchronous : 异步 (异步调用在发出之后,这个调用就直接返回了,所以没有返回结果,真正的结果是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。)
  • blocking: 阻塞 (指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。)
  • non-blocking : 非阻塞 (非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。)

2、JS中的异步IO、回调、Eventloop

异步IO:
异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
异步IO是单线程执行,遇到IO不阻塞,继续执行,IO执行完了会通知该线程,线程会在某个特定的时候处理IO返回的结果。
回调:
当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数

Eventloop:

js任务分两种,一种是同步任务(synchronous),一种是异步任务(asynchronous)

  • 同步任务是指在主线程上排队的任务,只有前一个任务执行完毕,才会执行后面的任务。
  • 异步任务是指不进入主线程,而是进入任务队列(task queue),当任务队列通知主线程某一个异步任务可以执行的时候,才会进入主线程执行。
  • 主线程从任务队列中读取事件,这个过程是不断循环的,称为EventLoop(事件循环)