Node.js的架构
作为一个服务端框架,Node.js
在运行时有许多依赖,其中最重要的两个是V8
引擎和libuv
库
V8
引擎使得Node.js
能够运行JavaScript
代码,是用JavaScript
和C++
开发的*libuv
库使得Node.js
能够进行文件操作、网络操作等,是用C++
开发的。其内部实现了事件循环和线程池:* 事件循环负责处理简单的任务,比如执行回调函数、网络IO
等* 线程池负责处理更加复杂的任务,比如文件访问、压缩等- 其它依赖*
http-parser
:用于解析http
请求和响应*c-ares
:异步DNS
解析库,可以和事件循环统一起来,实现DNS
的非阻塞异步解析*crypto(OpenSSL)
:用于实现安全通信,加密解密*zlib
:用于压缩和解压缩
Node 进程,线程和线程池
当我们运行Node.js
时,计算机后台便会开启一个Node.js
的进程(Node.js
本身也提供了用于进程管理的API)
与此同时,Node.js
的运行是单线程的,也就是说不管有多少用户在访问应用程序,所有指令都在一个线程中执行,这使得它非常容易被堵塞。具体来说,当Node.js
被启动时,会在单线程中依次执行以下操作:
初始化项目👉执行顶层代码(不在回调函数中)👉加载模块👉注册回调函数👉开启事件循环(回调函数中)
- 其中,事件循环扛起了一片天,会执行程序中的大部分任务,但有些任务确实过于复杂,如果在事件循环中执行,就会阻塞整个线程。time for 线程池
- 线程池提供了4个与主线程完全分开的线程&#x