JS运行机制:
js运行机制(即事件循环机制):js是单线程执行的,这意味着同一时间内只能做一件事,但这并不是说单线程就会阻塞,而要实现单线程且非阻塞的方法就是事件循环机制。
1、事件循环机制(EventLoop)
在js中,会把任务分为同步任务和异步任务,这两者的执行环境不同,同步任务会进入主线程,异步任务会进入事件队列(EventQueue),当主线程代码执行完毕后,会去事件队列中读取对应的异步任务,并推到主线程中执行,不断重复过程,称为事件循环机制(EventLoop) 。
2、js的任务分类
js中将任务分为同步任务和异步任务两大类
同步任务:只要被系统扫描到,就会被主线程马上执行的任务(优先于所有的异步任务)
异步任务:即使被扫描到,也不会马上执行,会被放到事件队列中,等主线程任务执行完毕,系统才会召回执行
3、异步任务分类
异步任务又被分为宏任务和微任务
在异步任务中,有些异步任务的平均执行周期很长,这些任务就被JavaScript标记为宏任务(比如延时器setTimeout())。而平均执行周期相对较短的任务,被称为微任务(如promise.then())
Node.js运行机制:
1、概念:
Nodejs是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript语言编写服务器端的应用程序。
Node.js采用了事件驱动、非阻塞I/O模型,使得它在处理大量并发请求时表现出色。
2、单线程与事件循环
Nodejs采用单线程模型来处理请求,这意味着它只使用一个线程来处理所有的请求。这与传统的多线程模型不同,多线程模型需要为每个请求创建一个新的线程,而单线程模型则只需要一个线程即可。
Nodejs的单线程模型并不意味着它只能处理一个请求,它实际上是通过事件循环来处理并发请求的。事件循环是Nodejs的核心机制之一,它负责接收请求、执行回调函数、处理I/O操作等。事件循环的基本流程如下:
1.执行全局代码,初始化运行环境。
2.进入事件循环,等待事件触发。
3.当有事件触发时,执行相应的回调函数。
4.回调函数执行完成后,事件循环继续等待下一个事件。
3、非阻塞I/O
Nodejs的非阻塞I/O模型是实现高并发能力的关键。在传统的阻塞I/O模型中,当一个V/O操作发生时,线程会被阻塞,直到该操作完成后才能继续执行后续代码。而在非阻塞I/O模型中,当一个I/O操作发生时,线程不会被阻塞,而是继续执行后续代码,当I/O操作完成后,通过回调函数来处理操作结果。
非阻塞I/O模型的好处是能够充分利用系统资源,提高系统的并发处理能力。在Node.js中,通过使用回调函数来处理I/O操作的结果,可以避免线程被阻塞,从而实现高并发处理。
4、事件驱动
Node.js的事件驱动机制是基于观察者模式的。在Nodejs中,事件是由事件触发器(EventEmitter)来发出的,而事件监听器(Listener)则负责接收并处理这些事件。
在Nodejs中,可以使用`on`方法注册事件监听器,当事件触发时,注册的回调函数就会被调用。通过事件驱动机制以实现模块之间的解耦,提高代码的可维护性和可扩展性。
5、模块化
Nodejs支持模块化开发,可以将代码划分为多个模块,每个模块负责处理特定的功能。模块化开发可以降低代码的耦合度,提高代码的可重用性。
在Node,js中,可以使用 require 函数来引入其他模块,通过 module.exports 来导出模块。这样,不同的模块之间可以通过引入和导出来共享数据和功能。
6、异步编程
由于Nodejs采用了非阻塞I/O模型,因此在编写Node.js应用程序时需要注意处理异步操作。异步编程是Node.js中的一个重要概念,它可以有效地处理I/O操作,提高系统的并发处理能力。
在异步编程中,可以使用回调函数、Promise、async/await等方式来处理异步操作。通过合理使用异步编程,可以避免阻塞线程,提高代码的性能和响应速度。
7、总结
Node.js的运行机制是基于单线程、事件循环和非阻塞I/O模型的。它通过事件驱动和异步编程来实现高并发处理能力。Nodejs的模块化机制可以将代码划分为多个模块,提高代码的可维护性和可重用性。通过深入理解Node.js的运行机制,我们可以更好地开发高性能的服务器端应用程序。