小编典典

同步和异步编程有什么区别(在node.js中)

all

我一直在阅读nodebeginner 并且遇到了以下两段代码。

第一个:

    var result = database.query("SELECT * FROM hugetable");
    console.log("Hello World");

第二个:

    database.query("SELECT * FROM hugetable", function(rows) {
       var result = rows;
    });
    console.log("Hello World");

我得到了他们应该做的事情,他们查询数据库以检索查询的答案。然后console.log('Hello world')

第一个应该是同步代码。第二个是异步代码。

这两件作品之间的区别对我来说非常模糊。输出会是什么?

谷歌搜索异步编程也没有帮助我。


阅读 74

收藏
2022-06-29

共1个答案

小编典典

不同的是,在第 一个示例 中,程序将在第一行阻塞。下一行 ( console.log) 将不得不等待。

第二个示例
中,console.log将在处理查询时执行。也就是说,查询将在后台处理,而您的程序正在做其他事情,一旦查询数据准备好,您将对其进行任何操作。

所以,简而言之:第一个例子会阻塞,而第二个不会。

以下两个示例的输出:

// Example 1 - Synchronous (blocks)
var result = database.query("SELECT * FROM hugetable");
console.log("Query finished");
console.log("Next line");


// Example 2 - Asynchronous (doesn't block) 
database.query("SELECT * FROM hugetable", function(result) {
    console.log("Query finished");
});
console.log("Next line");

将会:

  1. Query finished
    Next line

  2. Next line
    Query finished

注意
虽然 Node 本身是 单线程 的,但有些任务可以并行运行。例如,文件系统操作发生在不同的进程中。

这就是 Node 可以执行异步操作的原因:一个线程正在执行文件系统操作,而主 Node 线程继续执行您的 javascript 代码。在像 Node
这样的事件驱动服务器中,文件系统线程通知主 Node
线程某些事件,例如完成、失败或进度,以及与该事件相关的任何数据(例如数据库查询的结果或错误消息)并且主节点线程决定如何处理该数据。

您可以在此处阅读有关此内容的更多信息:Node.js 中单线程非阻塞 IO
模型的工作原理

2022-06-29