节点是单线程的是一个常见的误解。真相要复杂得多。虽然 Node 事件循环是单线程的,但 Node 标准库中包含的一些函数不是单线程的。
我们运行的包含在 Node 内部的一些函数在 Event Loop 之外运行,因此在该单线程之外运行。
所以我们在 Node 中编写的很多代码并没有完全在单线程中执行。
您可以通过编写代码亲自测试这一点,通过实现crypto 模块中的pbkdf2 函数,真正证明并非所有Node 都是真正的单线程。
您可以对pbkdf2 函数运行所需的时间进行基准测试,以了解线程和线程池在您的机器上的实际运行情况。因此,您可以创建各种pbkdf2 函数来表示线程。该函数将做一些昂贵的工作,您可以对其进行基准测试并使用它来检测 Node 是否是单线程的,如下所示:
const crypto = require('crypto');
const start = Date.now();
crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
console.log('1:', Date.now() - start);
});
此功能需要相当长的时间才能运行,因此在 2015 年中期的大多数 MacBook Pro 中大约需要 1 秒。
所以上面的回调函数正在计算一个哈希值,再次使用我上面指出的机器应该不超过 1 秒来完成,但函数的作用并不像在你的机器上执行多长时间那么重要。
您可以添加更多函数调用来表示更多线程,还可以调整机器线程池中的线程池大小,例如process.env.UV_THREADPOOL_SIZE = 2;。