面试题答案
一键面试1. 描述利用工作线程提升效率的方法
在 Node.js 中,主线程是单线程执行的,对于复杂的计算操作会阻塞事件循环,导致性能问题。工作线程允许我们将计算密集型任务分配到独立的线程中执行,这样主线程可以继续处理其他任务,从而提升整体效率。具体到对数组进行复杂数学计算(如求每个元素平方后再求和),可以将数组分割成多个部分,每个工作线程处理一部分,最后将各个部分的计算结果汇总得到最终结果。
2. 关键代码片段实现
const { Worker } = require('worker_threads');
const { performance } = require('perf_hooks');
// 待计算的数组
const largeArray = Array.from({ length: 1000000 }, (_, i) => i + 1);
// 分割数组为多个部分
const numWorkers = 4;
const chunkSize = Math.ceil(largeArray.length / numWorkers);
const chunks = [];
for (let i = 0; i < numWorkers; i++) {
const start = i * chunkSize;
const end = Math.min((i + 1) * chunkSize, largeArray.length);
chunks.push(largeArray.slice(start, end));
}
// 工作线程计算逻辑
const workerPromises = chunks.map((chunk) => {
return new Promise((resolve, reject) => {
const worker = new Worker(`
const { parentPort } = require('worker_threads');
const chunk = ${JSON.stringify(chunk)};
let sum = 0;
for (let num of chunk) {
sum += num * num;
}
parentPort.postMessage(sum);
`);
worker.on('message', (result) => {
resolve(result);
worker.terminate();
});
worker.on('error', (err) => {
reject(err);
worker.terminate();
});
});
});
const start = performance.now();
Promise.all(workerPromises)
.then((results) => {
const totalSum = results.reduce((acc, sum) => acc + sum, 0);
const end = performance.now();
console.log(`Total sum: ${totalSum}`);
console.log(`Execution time: ${end - start} ms`);
})
.catch((err) => {
console.error(err);
});
在上述代码中:
- 首先将大数组分割成
numWorkers
个部分。 - 然后为每个数组部分创建一个工作线程,在工作线程内部对该部分数组元素进行平方求和计算。
- 主线程通过
Promise.all
等待所有工作线程完成计算,并将结果汇总得到最终的总和。 - 同时使用
performance.now()
来测量整个计算过程的执行时间。