面试题答案
一键面试一般步骤和思路
- 引入模块:在Node.js项目中,引入
worker_threads
模块和网络请求模块(如http
或axios
)。worker_threads
用于创建多线程环境,网络请求模块用于发起实际的网络请求。 - 创建工作线程:使用
worker_threads
模块创建多个工作线程。每个工作线程负责独立处理网络请求,从而实现并发处理,提升性能。 - 分配任务:将网络请求任务分配给各个工作线程。可以通过向工作线程发送消息的方式传递请求参数等信息。
- 处理响应:工作线程完成网络请求后,将响应结果返回给主线程。主线程再对这些结果进行汇总或进一步处理。
简单示例代码(使用http模块和worker_threads)
- 主线程代码(main.js)
const { Worker } = require('worker_threads');
const http = require('http');
// 创建多个工作线程
const workers = [];
for (let i = 0; i < 3; i++) {
const worker = new Worker('./worker.js');
workers.push(worker);
worker.on('message', (result) => {
console.log('Received result from worker:', result);
});
worker.on('error', (error) => {
console.error('Worker error:', error);
});
worker.on('exit', (code) => {
if (code!== 0) {
console.error(`Worker stopped with exit code ${code}`);
}
});
}
// 向工作线程发送请求任务
workers.forEach((worker) => {
worker.postMessage({ url: 'http://example.com' });
});
- 工作线程代码(worker.js)
const { parentPort } = require('worker_threads');
const http = require('http');
parentPort.on('message', (task) => {
const options = {
hostname: new URL(task.url).hostname,
port: 80,
path: new URL(task.url).pathname,
method: 'GET'
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
parentPort.postMessage({ result: data });
});
});
req.end();
});
上述示例中,主线程创建了3个工作线程,并向每个工作线程发送了一个网络请求任务(这里以http://example.com
为例)。工作线程接收到任务后,使用http
模块发起网络请求,并将响应结果返回给主线程。主线程接收到结果后进行打印。实际应用中,可以根据具体需求对任务分配、请求处理和结果处理等部分进行更复杂的设计。
若使用axios模块
- 安装axios:在项目目录下执行
npm install axios
。 - 修改工作线程代码(worker.js)
const { parentPort } = require('worker_threads');
const axios = require('axios');
parentPort.on('message', async (task) => {
try {
const response = await axios.get(task.url);
parentPort.postMessage({ result: response.data });
} catch (error) {
parentPort.postMessage({ error: error.message });
}
});
主线程代码(main.js)保持不变,这样就实现了使用axios
结合worker_threads
来处理网络请求。