Node.js基础-进程、线程、线程池

Node.js基础-进程、线程、线程池

Node.js进程:程序的运行实例

在操作系统中,进程是程序的一次执行实例,它拥有独立的内存空间和至少一个执行线程。你每次运行node app.js,实际上就是启动一个Node.js进程;

当进程启动的时候,会发生什么?

  • 初始化程序: 加载Node.js运行时环境;
  • 执行顶层代码:从入口文件开始,自上而下执行不再回调函数内的"顶层"同步代码;
  • 加载模块:处理我们代码中的require或import,构建模块依赖树;
  • 注册事件回调:当遇到fs.readFile(),server.listen()等异步调用时,会将其回调注册到事件循环的相应阶段;
  • 启动事件循环:这是Node.js的心脏,只要还有未处理的事件或回调,它就会持续运转;

单线程:Event Loop的主战场

Node.js本身在JavaScript层面是单线程运行的,这个单线程指的是事件循环运行的主线程;

  • 这个主线程不停轮询:检查调用栈是否为空、是否有待执行的微任务、是否有到期的定时器等;
  • 它可以处理成千上万的并发连接:由于主线程不负责执行耗时任务,只负责任务的分发和结果的回调,所以这种I/O的切换就会变的非常高效;

单线程的优势

  • 不需要担心多线程编程中的锁、竞态、死锁等问题;
  • 内存开销小,上下文切换成本极低;

单线程的软肋

  • 如果主线程执行了CPU密集型任务,比如大循环、复杂加密,这样就是占满整个调用栈,导致事件循环卡死,其他所有的回调都无法及时执行;

线程池

为了解决某些无法由操作系统内核异步万恶很难过的耗时任务,Node.js借助libuv提供了线程池

默认配置

  • libuv的线程池默认包含了4个线程
  • 但是你可以通过环境变量设计线程数,但是最大不建议超过CPU核心数;

线程池负责的工作

  • 文件系统API:如fs.readFile、fswriteFile等。文件I/O在大多数操作系统中缺少真正的异步内核接口,所有由线程池模拟异步;
  • Cryptography:如 crypto.pbkdf2、crypto.scrypt 等CPU密集的加密操作。
  • Compression :zlib 库的压缩/解压操作,计算量大,会在线程池中执行。
  • DNS查询 :dns.lookup 会使用底层的 getaddrinfo 调用,该调用在线程池中执行;而 dns.resolve 则使用 c-ares 库,是真正的异步网络调用,不走线程池。

工作流程:

  1. 主线程执行到这些耗时操作时,将任务和回调提交给线程池;
  2. 线程池中的一个空闲线程会取走任务并在后台执行;
  3. 执行完毕后,把回调连同结果绑定到事件循环的某个I/O观察者上;
  4. 事件循环在适当的轮询阶段取出回调,在主线程上执行。

这种设计使得主线程永远保持轻量、响应迅速。

相关推荐
FungLeo14 分钟前
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单
golang·node.js·go·openapi·契约测试·成为全栈
FungLeo19 小时前
成为全栈·Go 后端篇·契约一致性与差分测试:两套实现如何互相校验
golang·node.js·go·合约测试·差分测试·成为全栈·api兼容
月夏1 天前
前端第一次接自己的后端:mock 切真接口踩了 2 个坑,组件只改了一行 import
前端·后端·node.js
SEO_juper1 天前
Node.js 页面主题聚焦度检测:title 和正文各说各的,AI 也读不懂
开发语言·人工智能·node.js·seo·外贸独立站
SEO_juper2 天前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
king13598745502 天前
AI Agent 端云协同选型:Node.js 任务成本算例与权限检查清单(2027—2028 展望)
人工智能·ai·node.js·ai agent
居里先生7522 天前
PDF 批注到底存在文件的哪里?从 /Annots 讲到导出验证
node.js
MasonYyp3 天前
安装npm依赖仓库Verdaccio
前端·npm·node.js
编程的一拳超人4 天前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent
lucas_AI4 天前
今年 2 月就修好的漏洞,10 月才炸:HTTP2Shell 把 Node、Python 一锅端
node.js