同步、异步与阻塞、非阻塞、协程

什么是异步和同步

异步编程对 JavaScript 语言太重要。JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可。

所谓"异步",简单的说一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。这种不连续的执行,就叫做异步。相应地,连续的执行,就叫做同步。

阻塞与非阻塞

阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态.

阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
socket接收数据函数recv是一个阻塞调用的例子。
当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

协程

传统的编程语言,早有异步编程的解决方案。其中有一种叫做"协程"(coroutine),意思是多个线程互相协作,完成一个任务。

举例来说,读取文件的协程写法如下。


function asnycJob() {
  // ...其他代码
  var f = yield readFile(fileA);
  // ...其他代码
}

上面代码的函数 asyncJob 是一个协程,它的奥妙就在其中的 yield 命令。它表示执行到此处,执行权将交给其他协程。协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。

原文地址:https://www.cnblogs.com/lanchang/p/7365116.html