一、什么是”异步非阻塞式”?
这个名字听起来很恶心难懂,但如果以 买内裤 这件事情来比喻执行程序的话就很容易理解“异步非阻塞式”的涵义了。
例如你是一个CPU的线程,你需要去执行一段 买内裤的程序, 你所需执行的步骤大致如下,
- 到一个商店里问老板, 你们店里还有没有nb牌内裤?
- 买到内裤,穿上
- 去小卖店买点火腿回家喂狗
这时候,你作为一个线程,你可能会遇到几种状况或选择。
- 店里面没货了,老板一直不答应你(阻塞你),你也一直等着(同步),第三天有货了才告诉你有了,你赶紧拿到穿上,再去买火腿 – [同步阻塞模式]
- 老板马上告诉你“没货了”(不阻塞你),然后你每天去店里问一声,直到有货了赶紧穿上,再去买东西喂狗 – [同步非阻塞]
- 你让老板有货了打电话叫你过来取,老板说“好的”(非阻塞),然后你就先去买东西喂狗了,过了两天老板叫你过去,你才拿到内裤并穿上 – [异步非阻塞]
- 你让老板有货了打电话叫你过来取, 老板又没答应你(阻塞), 然后你本来打算去先去买火腿的(异步),这时候也没法去了。 – [异步阻塞]
很明显,第三种方法是最聪明,前两种方法都略显效率低下。所以根据我们的理解,
同步或非同步,表明着是否需要将整个流程顺序地完成
阻塞或非阻塞,意味着你调用的函数会不会立刻告诉你结果
二、在js中的阻塞与同异步
你有一个函数和一段程序。
2.1 js中的同步阻塞
// 这是一个阻塞式函数, 将一个文件复制到另一个文件上
function copyBigFile(afile, bfile){
var result = copyFileSync(afile,bfile);