【发布时间】:2017-09-14 22:02:40
【问题描述】:
假设makeBurger() 需要 10 秒
在同步程序中,
function serveBurger() {
makeBurger();
makeBurger();
console.log("READY") // Assume takes 5 seconds to log.
}
这总共需要 25 秒才能执行。
所以对于 NodeJs,假设我们制作了 makeBurgerAsync() 的异步版本,这也需要 10 秒。
function serveBurger() {
makeBurgerAsync(function(count) {
});
makeBurgerAsync(function(count) {
});
console.log("READY") // Assume takes 5 seconds to log.
}
因为它是单线程。我很难想象幕后到底发生了什么。
- 所以当函数运行时,两个异步函数都会进入事件循环,
console.log("READY")会立即执行。 - 但是当
console.log("READY")正在执行时,两个异步函数都没有真正完成工作,对吧?由于单线程占用了 console.log 5 秒。 - console.log 完成后。 CPU 将有时间在两个异步之间切换,以便每次可以运行每个函数的一点点。
所以根据这个,函数不一定会导致更快的执行,async 可能由于在事件循环之间切换而变慢?我想,在一天结束的时候,一切都将分散在一个线程上,这与同步版本是一样的吗?
我可能错过了一些非常重要的概念,所以请告诉我。谢谢。
编辑 如果异步操作类似于查询数据库等,这是有道理的。基本上,nodejs 只会说“嘿,数据库为我处理这个,而我会做其他事情”。但是,我不理解的情况是nodejs本身内部的自定义回调函数。
EDIT2
function makeBurger() {
var count = 0;
count++; // 1 time
...
count++; // 999999 times
return count;
}
function makeBurgerAsync(callback) {
var count = 0;
count++; // 1 time
...
count++; // 999999 times
callback(count);
}
【问题讨论】:
-
这取决于 makeBurgerAsync 是更像是在事件循环中推迟执行的 setTimeout 还是更像是在实际方法完成后才执行连续执行的等待。在后一种情况下,console.log 不会在 5 秒内完成,它会在两个调用完成后出现。
-
这取决于为什么完成“异步”操作需要 10 秒。如果这 10 秒用于阻塞事件循环,那么是的,它将阻塞 10 秒,但是它只会阻塞 在 console.log 发生之后,因为需要 10 秒的操作本来是推到回调队列。 (并且它会阻止在这 10 秒窗口期间进入的任何请求)如果这 10 秒用于等待,例如,文件 i/o 或 http,因此没有阻塞事件循环,则没有明显的阻塞。
-
@WiktorZychla ""更像是等待在实际方法完成后才执行持续的东西" 你能澄清一下这个说法吗?谢谢你的回复!
-
澄清:js中没有
fooAsync这样的东西。要么是fooAsync(callback),它在完成后立即返回并执行回调,要么是await fooAsync,它在完成后执行下一行。您的示例makeBurgerAsync需要明确说明您实际指的是哪种异步执行。 -
我的意思是......它没有有让你知道什么时候它是异步的@WiktorZychla。
标签: node.js asynchronous