来了解NodeJS的事件循环原理吧:图文+代码

lxf2023-05-05 04:07:01

持续创作,加速成长!这是我参与「AdminJS · 10 月更文挑战」的第5天,点击查看活动详情

Node.js的架构

作为一个服务端框架Node.js在运行时有许多依赖,其中最重要的两个是V8引擎和libuv

  • V8引擎使得Node.js能够运行JavaScript代码,是用JavaScriptC++开发的

  • 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被启动时,会在单线程中依次执行以下操作:

初始化项目