假設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