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

我一直在阅读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')

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

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

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


答案 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 线程决定如何处理该数据。

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


答案 2

这两种方法之间的区别如下:

同步方式:它等待每个操作完成,之后只有它执行下一个操作。对于您的查询:除非查询已完成执行以从数据库获取所有结果,否则该命令将不会执行。console.log()

异步方式:它从不等待每个操作完成,而是仅在第一个 GO 中执行所有操作。一旦结果可用,将处理每个操作的结果。对于您的查询:该命令将在方法之后不久执行。当数据库查询在后台运行时,并在完成检索数据后加载结果。console.log()Database.Query()

使用案例

  1. 如果您的操作没有像从数据库查询大量数据那样执行非常繁重的工作,那么请继续使用同步方式,否则使用异步方式。

  2. 在异步方式中,您可以向用户显示一些进度指示器,而在后台,您可以继续进行重量级工作。这是 GUI 应用的理想方案。