假设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将有时间在两个异步之间进行切换,以便每次都可以运行一些函数。
所以根据这个,函数不一定会导致更快的执行,由于事件循环之间的切换,异步可能会更慢?我想,在一天结束的时候,所有东西都会传播到一个单独的线程上,这个线程与同步版本是一样的。
我可能错过了一些非常大的概念,所以请让我知道。谢谢。
编辑 这是有道理的,如果异步操作都像查询数据库等,基本上将的NodeJS只是说“嘿DB处理这对我,而我会做别的事情。”然而,我不明白的情况是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“”更像是等待一些让实际方法完成后连续执行的东西。“你能澄清一下这句话吗?谢谢你的回应! – Zanko