稳定性: 2 - 稳定

    worker_threads 模块允许使用并行地执行 JavaScript 的线程。 要访问它:

    1. const worker = require('worker_threads');

    工作线程对于执行 CPU 密集型的 JavaScript 操作非常有用。 它们在 I/O 密集型的工作中用途不大。 Node.js 的内置的异步 I/O 操作比工作线程效率更高。

    child_processcluster 不同,worker_threads 可以共享内存。 它们通过传输 ArrayBuffer 实例或共享 SharedArrayBuffer 实例来实现。

    1. const {
    2. Worker, isMainThread, parentPort, workerData
    3. } = require('worker_threads');
    4. if (isMainThread) {
    5. module.exports = function parseJSAsync(script) {
    6. return new Promise((resolve, reject) => {
    7. const worker = new Worker(__filename, {
    8. workerData: script
    9. });
    10. worker.on('message', resolve);
    11. worker.on('error', reject);
    12. worker.on('exit', (code) => {
    13. if (code !== 0)
    14. reject(new Error(`工作线程使用退出码 ${code} 停止`));
    15. });
    16. });
    17. };
    18. } else {
    19. const { parse } = require('一些 js 解析库');
    20. const script = workerData;
    21. parentPort.postMessage(parse(script));
    22. }

    上面的示例为每个 parse() 调用衍生一个工作线程。 在实际的实践中,应使用工作线程池代替这些任务。 否则,创建工作线程的开销可能会超出其收益。

    当实现工作线程池时,可使用 [AsyncResource] API 来通知诊断的工具(例如为了提供异步的堆栈跟踪)有关任务及其结果之间的相关性。 有关示例的实现,请参见 async_hooks 文档中的[“为 Worker 线程池使用 AsyncResource”][async-resource-worker-pool]。

    默认情况下,工作线程继承非特定于进程的选项。 请参见[工作线程的构造函数选项][Worker constructor options],以了解如何自定义工作线程的选项,特别是 argvexecArgv 选项。