【问题标题】:node.js - precision about code execution pathnode.js - 关于代码执行路径的精度
【发布时间】:2016-04-26 02:01:08
【问题描述】:

我一直在阅读 node.js 是单线程和同步的。但是,I/O 请求是异步执行的[1]

我有一个问题。给定以下代码sn-p:

c.query(  //#1
'SELECT SLEEP(20);',  //#2
    function (err, results, fields) {
      console.log("query executed"); //#3
    }
);
console.log("hello"); //#4

假设队列中有 2 个请求。我的理解如下:第一个请求执行这个路径#1->#2->#4->#3。然后处理第二个请求。

从我一直在阅读的内容来看,作者似乎在暗示#1->#2->#4。由于#3 是异步的(等待 I/O),所以同时处理第二个请求。

有人可以澄清一下吗?谢谢。

【问题讨论】:

    标签: mysql node.js asynchronous io


    【解决方案1】:

    Node.js 事件流基于异步回调。

    这样,即使 Node.js 是单线程的,当你调用一个接受回调的函数时,该函数也是异步调用的,不会阻塞同步代码的执行。

    在您插入的示例中,您可以看到 query 函数接受回调作为最后一个参数。一旦被调用,Node.js 就会在事件流上发送执行,继续执行下一行代码。

    为了澄清,在该示例中没有#2 路径,'SELECT SLEEP(20);' 是查询函数的第一个参数。第二个参数是查询函数返回结果时执行的回调函数function (err, results, fields) {}

    流程将是#1->#3->#2:

    c.query('SELECT SLEEP(20);',//#1
        function (err, results, fields) {
            console.log("query executed"); //#2
        }
    );
    console.log("hello"); //#3
    

    【讨论】:

    • 由于#1让mysql数据库休眠20s,所以#1->#3->#2表示#2在20s后执行。然后#1 阻止执行,对吗?
    • 并非如此。我们说的是node.js的执行流程。如果您进行类似“SELECT SLEEP(20000)”的操作,您的数据库将休眠 20 秒,但 node.js 不会被阻塞,并将继续执行下一行代码。其他逻辑取决于您正在构建的应用程序。
    • 所以如果#3需要很长时间,那么我们可以假设路径可以变成#1->#2->#3?
    • 对不起,我在粘贴代码时出错了。 #2 是异步的。它总是在 #3 之后执行,不管需要多长时间。
    • 好的,这是有道理的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多