gpt4 book ai didi

javascript - 在并发且没有多处理的情况下,代码按什么顺序执行?

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:39 25 4
gpt4 key购买 nike

我正在使用 Node 构建一个应用程序,我想知道以下内容。我知道nodejs是并发的,但不是多处理的。如果我有一个回调应该在执行其他代码时执行,它是否只是暂停其他代码来执行回调?

考虑以下代码:

function mycallback(data) {
// some code
}

function_which_takes_a_callback(mycallback);

for (let i = 0; i < 9999999999; i++) {
// do something else
}

如果回调在 for 循环仍在运行时返回,它是否只是停止执行循环及其中的代码以执行 mycallback() 函数,然后继续循环?或者它完成循环了吗?或者还有别的什么?

nodejs 处理此问题的方式与其他并发但非多处理语言不同(不知道还有哪些其他语言,但我认为还有其他语言)?

最佳答案

for (let i = 0; i < 9999999999; i++) {
// some blocking stuff
// some non-blocking stuff
}

所谓阻塞,是指系统正在执行的同步代码执行,不能被中断。考虑那里的图像调整大小调用,或者可能是同步发生的文档到 PDF 转换。

非阻塞,它意味着执行某些部分的代码,并且可能会等待将来的某些事件或某些 I/O(写入磁盘?,用户输入(获取)或网络(xhr?)),当执行此类调用时,它们运行其部分代码并将自己注册到队列中,一旦挂起的事情完成,它们就可以从队列中恢复。

现在,如果执行以下代码会发生什么(添加行号以供引用):

1. function mycallback(data) {
2. // some code
3. }

4. function_which_takes_a_callback(mycallback);

5. for (let i = 0; i < 999; i++) {
6. // some blocking stuff(for example 1s)
7. // some non-blocking stuff
8. }

从第 1-3 行开始,注册了一个函数 mycallback
在第 4 行,执行了一个 function_which_takes_a_callback 并传递了 mycallback,它做了一些工作,并且可能会在完成后调用 mycallback在第 5-8 行,执行 999 次后,线程将阻塞至少 999 次,直到执行 mycallback 为止。

只有在该代码执行完成后,才会释放堆栈,从而提示事件循环从事件队列中检查可以处理的事件。

试试这个:

function syncCode() {
var fromTime = Date.now();
var toTime = Date.now() + 1000;
while (fromTime < toTime) {
fromTime = Date.now();
}
}
function asyncCode() {
console.log(new Date(), "Invoked asyncCode");
setTimeout(() => {
console.log(new Date(), "async code should have come 1s after Start");
}, 1000);
}
console.log(new Date(), "Start");
asyncCode();

console.log("Sync code repeatedly for 10s");
for(var i = 0; i < 10; i++) {
syncCode();
setTimeout(() => {
console.log(new Date(), "sync code should be coming after async code callback");
}, 1000)
}
console.log(new Date(), "End");

关于javascript - 在并发且没有多处理的情况下,代码按什么顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50803949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com