如何使用Node.js运行多个并行的HTTP请求

如何使用Node.js运行多个并行的HTTP请求

我们知道NodeJS应用程序是单线程的。假设处理包括需要10秒的请求A,这并不意味着后续的请求需要等待10秒才开始处理,因为NodeJS事件循环只是单线程的。整个NodeJS架构并非单线程。

NodeJS如何处理多个客户端请求?

NodeJS接收多个客户端请求,并将它们放入 事件队列 中。NodeJS是基于事件驱动架构构建的。NodeJS有自己的 事件循环 ,它是一个无限循环,接收请求并处理。事件循环是事件队列的监听器。

如果NodeJS能够在没有I/O阻塞的情况下处理请求,事件循环将自行处理请求并将响应自己发送回客户端。但是,可以使用NodeJS的 集群 模块或 worker_threads 模块来并行处理多个请求。

如何使用集群模块扩展NodeJS应用程序?

单个Node.js实例在单个线程中运行。如果您有多核系统,可以利用每个核心。有时开发人员想要启动一个NodeJS进程集群,以利用多核系统。

集群模块允许轻松创建共享相同服务器端口的子进程。

步骤1: 创建一个NodeJS应用程序并安装所需的 Express.js 模块。

mkdir Project && cd Project
npm init -y 
npm i express

步骤2: 在根目录下创建一个 index.js 文件,并复制以下代码。

const express = require('express');
const cluster = require('cluster');
 
// Check the number of available CPU.
const numCPUs = require('os').cpus().length;
 
const app = express();
const PORT = 3000;
 
// For Master process
if (cluster.isMaster) {
  console.log(`Master {process.pid} is running`);
 
  // Fork workers.
  for (let i = 0; i{worker.process.pid} died`);
  });
}
 
// For Worker
else{
 
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  app.listen(PORT, err =>{
    err ? 
    console.log("Error in server setup") :
    console.log(`Worker ${process.pid} started`);
  });
}

解释: 如果您的系统有8个CPU,则将创建8个NodeJS实例,每个实例都有自己独立的事件循环。现在NodeJS可以并行处理所有请求。

它们都共享相同的端口(端口3000),但状态不同。主进程监听一个端口,接受新的连接并以循环方式在工作进程之间分配它们,带有一些内置智能来避免过载一个工作进程。

步骤3: 使用以下命令运行 index.js 文件。

node index.js

输出:

如何使用Node.js运行多个并行的HTTP请求

使用Worker Threads模块: Worker Thread是解决CPU性能问题的最佳方案。在Node.js中使用该模块有助于执行繁重的JavaScript任务。

不同于:

  • 一个进程
  • 一个线程
  • 一个事件循环
  • 一个JS引擎实例
  • 一个Node.js实例
  • Worker threads拥有:

一个进程

  • 多个线程
  • 每个线程一个事件循环
  • 每个线程一个JS引擎实例
  • 每个线程一个Node.js实例

示例: 创建一个index.js文件,代码如下所示:

index.js

const {Worker} = require('worker_threads');
 
const worker = new Worker(__filename);
worker.on('message', message => console.log(message));
 
worker.postMessage('GeeksforGeeks');
worker.emit(true)

使用以下命令运行服务器:

node --experimental-worker index.js

注意: 我们必须使用 --experimental-worker ,因为Workers线程模块仍处于实验阶段。

输出:

{ name: ‘GeeksforGeeks’ }

Worker_Threads的优点:

  • 传递原生句柄(http/https请求)
  • 死锁检测。
  • 更高的隔离性,因此如果一个进程受到影响,不会影响其他进程。

    Worker_Threads的缺点:

  • 不适用于I/O操作。

  • 创建工作线程不廉价。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程