Node.js Express多线程实现:同时处理并发API请求
用Worker Threads实现Express服务器并行处理耗时请求
问题场景
我有一个简易Node.js Express服务器,仅提供一个API接口,请求后需10秒才响应。当两个API请求几乎同时到达时,服务器要等第一个请求响应完成后才处理第二个,希望能同时接收并处理这两个请求。
解决方案
利用Node.js的worker_threads模块,将耗时任务剥离到独立的工作线程中执行,避免阻塞主线程,让多个请求可以并行处理。
主服务器代码(server.js)
const express = require('express'); const { Worker } = require('worker_threads'); const http = require('http') const app = express(); const port = 3000; app.use(express.json()); app.get('/api/perform-task', (req, res) => { const task = req.body.task; console.log('accepting request...'); // 为每个请求创建独立的工作线程 const worker = new Worker('./worker.js'); worker.postMessage(task); // 接收工作线程返回的结果 worker.on('message', (result) => { console.log('Task completed:', result); res.json({ 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}`); } }); }); const server = http.createServer(app) server.listen(3000, '0.0.0.0', () => { console.log(`Server is running on port ${port}`); });
工作线程代码(worker.js)
const { parentPort } = require('worker_threads'); // 接收主线程传递的任务 parentPort.on('message', async (task) => { // 执行耗时任务(比如调用第三方服务) const result = await performTask(task); // 将结果返回给主线程 parentPort.postMessage(result); }); // 模拟耗时任务(10秒延迟) async function performTask(task) { return new Promise((resolve) => { setTimeout(() => { resolve(`Task completed: ${task}`); }, 10000); }); }
效果说明
现在当两个请求几乎同时到达时,服务器会立即为每个请求创建独立的工作线程,两个耗时任务会并行执行,10秒后两个请求都会得到响应,而非串行等待20秒。主线程仅负责接收请求和转发结果,不会被耗时任务阻塞。
内容的提问来源于stack exchange,提问作者Senior Dev
相关产品推荐
相关产品推荐

