代码之家  ›  专栏  ›  技术社区  ›  kramer65

在并发性和没有多个处理的情况下,代码的执行顺序是什么?

  •  0
  • kramer65  · 技术社区  · 6 年前

    我正在使用节点构建一个应用程序,我想知道以下内容。我知道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 处理这与其他并发但非多处理语言不同(不知道其他语言是什么,但我假定还有其他语言)?

    2 回复  |  直到 6 年前
        1
  •  1
  •   freakish    6 年前

    mycallback() 函数,然后继续循环?

    nodejs 处理这与其他并发但非多处理语言不同(不知道其他语言是什么,但我假定还有其他语言)?

    setTimeout

    function busy(timeout) {
        var n = Date.now();
        var end = n + timeout;
        while (n < end)
            n = Date.now();
    }
    setTimeout(function() { console.log('test'); }, 1000);
    busy(3000);
    

    观察控制台上的指纹 test

        2
  •  2
  •   kiddorails    6 年前
    for (let i = 0; i < 9999999999; i++) {
        // some blocking stuff
        // some non-blocking stuff
    }
    

    舞台调度

    非阻塞

    现在,如果执行以下代码(添加行号以供参考),会发生什么情况:

    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行,执行一个接受回调的函数,并传递mycallback,它会做一些工作,并在完成后调用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");