Node.js程序的生命周期以及事件循环
Node.js 程序的生命周期
当我们使用node app.js执行文件时,node.js 会运行整个文件,解析代码,注册变量和函数等,我们会一直处于这个运行文件中,这是因为 node.js 的事件循环。
事件循环
事件循环处理处理所有的回调
由 node.js 管理的循环进程。只要其中的工作没有做完,它就会一直运行程序。
这意味着这样注册了事件监听器程序就会一直执行(没有手动强制退出的情况下)。
- 告诉 node.js 这里的工作都执行完了,强制退出:
process.exit();
node.js 不止在服务器上使用事件循环,也在其他地方使用,例如数据库。
原因:
node.js 使用事件循环是因为它实际上执行的 JS 是单线程,整个 node 程序使用的是计算机里的一个线程;而如果用 node 创建一个服务器,那它应该能够处理传入的多个数据请求,而不是因为一个请求暂停而导致所有请求等待。
当我们执行 node.js 时事件循环就自动开启了,它负责处理事件回调函数。它会优先处理快速完成的回调函数。
而 fs 模块的功能会被发送到一个工作池中,这个工作池运行在不同的线程中,跟 JS 代码是完全分离的。这个工作池和操作系统密切相关,可以启动多个线程 。我们读取或写入文件就在这个工作池中进行,而当读写或写入(工作)完成后,它会触发事件循环里对应的回调函数进入事件循环的队列。

事件循环()
Node.js 在主线程里维护了一个事件队列,当接到请求后,就将该请求作为一个事件放入这个队列中,然后继续接收其他请求。当主线程空闲时(没有请求接入时),就开始循环事件队列,检查队列中是否有要处理的事件,这时要分两种情况:如果是非 I/O 任务,就亲自处理,并通过回调函数返回到上层调用;如果是 I/O 任务,就从 **线程池 **中拿出一个线程来处理这个事件,并指定回调函数,然后继续循环队列中的其他事件。
当线程中的 I/O 任务完成以后,就执行指定的回调函数,并把这个完成的事件放到事件队列的尾部,等待事件循环,当主线程再次循环到该事件时,就直接处理并返回给上层调用。 这个过程就叫 **事件循环 **(Event Loop)
Node.js 本身是一个多线程平台,而它对 JavaScript 层面的任务处理是单线程的。
Node.js 事件循环和 JS 事件循环
