Node.js 概念

事件驱动、非阻塞 I/O、单线程——这三个词到底在说什么。

Beginner
Key PointsNode 用单线程 + 事件循环处理并发;耗时的 I/O 交给系统内核,回调排队等结果。

三个关键词

  • 单线程 —— 你的 JavaScript 只有一条执行线程
  • 非阻塞 I/O —— 发起读文件后立刻返回,不等结果
  • 事件驱动 —— 结果就绪时触发回调,事件循环去执行它

Together they mean ten thousand concurrent connections cost one thread's memory, while the classic thread-per-connection model needs ten thousand threads. That is where Node wins on long-lived connections.

阻塞 vs 非阻塞

JavaScript
const fs = require('node:fs');

// 同步:读文件期间整条线程停住
const data = fs.readFileSync('big.txt', 'utf8');
console.log('同步读完', data.length);

// 异步:立刻返回,读完再回调
fs.readFile('big.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log('异步读完', data.length);
});
console.log('这行先执行');
Output
同步读完 1048576
这行先执行
异步读完 1048576

注意输出的顺序:这行先执行 排在异步回调之前。异步 API 只是发起了读操作,真正的读取由操作系统完成,完成后把回调塞进事件循环的队列。

Node 不适合什么

TaskVerdictReason
读 10 万个文件适合I/O 密集,内核并行
压缩 1GB 图片不适合CPU 占满,事件循环卡死
1 万条 WebSocket很适合每连接内存开销极低
矩阵运算不适合没有 SIMD、没有多线程数值库
"Single-threaded" refers to your code. libuv's internal thread pool (4 by default) handles files, DNS and crypto, so concurrent I/O is still parallel.

Friends & Partners