如果Node.js是单线程的,那么如何处理并发

如果Node.js是单线程的,那么如何处理并发

Node.js是一个使用JavaScript作为脚本语言的开源虚拟机。尽管是单线程的,但它是最流行的Web技术之一。尽管是单线程的,Node.js之所以受欢迎的原因是它的 异步性质 ,使得它能够处理并发并同时执行多个I/O操作。Node.js使用一个 事件循环 来维持并发性并执行非阻塞I/O操作。

一旦Node.js启动,它就初始化一个事件循环。事件循环在一个名为 事件队列 的队列上工作,并按照先进先出的顺序执行任务。只有在 调用栈 中没有正在进行的任务时,它才执行任务。调用栈按照后进先出的顺序工作。事件循环不断地检查调用栈,以查看是否有需要运行的任务。现在,每当事件循环找到一个函数时,它就将其添加到栈中并按顺序运行。

让我们看一个示例,以更好地理解调用栈和事件循环是如何处理并发的。

示例1: 在这个示例中,我们将看到调用栈的工作原理。

<script> 
function add(a,b){ 
   return a+b; 
} 
function print(n){ 
   console.log(`Two times the number ${n} is `+add(n,n)); 
} 
  
print(5); 
</script>

输出:

Two times the number 5 is 10

解释: 在这里,当代码执行时,函数print(5)将被调用并推入调用栈。当函数被调用时,它开始打印其中的语句,但在打印整个语句之前,它遇到另一个函数add(n,n),暂停当前的执行,并将add函数推入调用栈的顶部。现在函数将返回a+b的加法结果,然后从栈中弹出,现在之前被暂停的函数将开始运行,并将输出记录到控制台,然后这个函数也将从栈中弹出,此时栈为空。这就是调用栈的工作原理。

示例2: 在这个示例中,我们将看到事件循环的工作原理。

<script> 
function func(){ 
    console.log("Statement 1 inside function"); 
    setTimeout(function(){ 
        console.log("Statement 2 inside function"); 
    },2000); 
    console.log("Statement 3 inside function"); 
      
} 
console.log("Statement outside function"); 
func(); 
</script>

输出:

Statement outside function
Statement 1 inside function
Statement 3 inside function
Statement 2 inside function

解释: 在上面的示例中,首先将第一个控制台语句“statement outside function”推入堆栈,并在控制台中记录并弹出堆栈。现在将调用函数func()并将其推入堆栈。然后将语句1“Statement 1 inside function”推入并记录控制台并从堆栈中弹出。然后,运行时转到setTimeout()函数,因为这是一个Web API,它现在转到浏览器,浏览器将设置计时器并执行它,然后它弹出堆栈,同时下一个语句进入调用堆栈,因此“Statement 3 inside the function”将被打印到控制台。现在当2秒(2000毫秒)完成时,浏览器将函数推回到事件队列中。现在,事件循环检查调用堆栈是否为空,然后将函数推入调用堆栈,并将“Statement 2 inside the function”打印到控制台,并将函数弹出堆栈。现在函数已经完成,没有更多的事件了。

这就是使用事件循环和调用堆栈实现并发性的方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程