You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:55:08