Nodejs Express http 服务器如何处理并发请求?

2024-01-09

我正在构建一个 Node.js 应用程序,并想了解如何处理并发请求。

我构建了一个测试服务器,通过等待 10 秒来模拟高 CPU 负载。为了测试行为,我打开两个浏览器选项卡并同时刷新页面。

const http      = require('http');
const express       = require('express');
const bodyParser        = require('body-parser');
const app       = express();
const server        = require('http').createServer(app);  

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.get('*', function (req, res, next) {
    var requestTime = new Date().getTime(),
            executionTime;

    doHeavyWork(requestTime, function(error){
        res.send({
            requestTime     : requestTime,
            executionTime   :   executionTime
        });
    });

});

function doHeavyWork (requestTime, callback) {
    var sleepSeconds = 10;

    while (requestTime + sleepSeconds*1000 >= new Date().getTime()) {}

    callback(null);
}

server.listen(1337, '127.0.0.1');

根据我对 Node.js 的了解,我希望两个选项卡能够同时完成加载。实际上,最先刷新的选项卡也会先完成。下一个选项卡将在 10 秒后加载。所以基本上,服务器一次处理一个请求,而不是同时处理它们。我在这里缺少什么?


在不进入主题的情况下回答您的问题实质内容 https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/关于 Node 的工作原理(我建议您阅读),您看到的行为正是我期望根据您的代码看到的行为。

对于运行的每个 Node 实例,都有一个处理线程,在大容量场景中,建议尽可能少地执行 CPU 密集型操作,以免阻塞该线程。在您的示例中,每个请求都运行 10 秒的 CPU 密集型操作,这意味着在该请求完成之前 Node 无法处理任何新请求。

如果您想更好地演示 Node 的吞吐量,请使用非阻塞示例,例如使用定时器

app.get('*', function (req, res, next) {
  var requestTime = new Date().getTime(),
        executionTime;

  setTimeout(() => {
    res.send({
      requestTime,
      executionTime: new Date().getTime()
    });
  }, 10000);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs Express http 服务器如何处理并发请求? 的相关文章

  • 如何在 PyV8 中加载 Nodejs 模块?

    如何在 PyV8 中加载 Nodejs 模块 我读过所有关于 jsdom 在与 Nodejs 一起运行时有多么出色的内容 如果我在 Python 应用程序中运行 v8 使用 python 获取 Web 资源 然后将生成的 html 字符串提
  • 如何从控制器返回 PDF 文件

    我正在尝试使用 NestJs 从控制器端点返回 PDF 文件 未设置时Content typeheader 返回的数据getDocumentFile 很好地返回给用户 然而 当我添加标头时 我得到的返回似乎是某种奇怪形式的 GUID 响应总
  • Visual Studio 代码断点在使用 TypeScript 的 Node.js 上不起作用

    我尝试了很多解决方案 但没有人适合我 代码执行 但我无法放置断点并调试它 请你帮助我好吗 我尝试过以下 VSCode 配置脚本 type node request launch name Typescript Node JS program
  • Mongodb更新很多

    我正在使用express js 和 npm 模块 mongodb 进行开发 并以 mongodb 作为数据库 我有两个集合 即 用户 和 活动 一个用户可能有数千个活动 首先 我将用户的 id 姓名和图片 url 存储到 关系的活动文件 请
  • Child_process 处理带有回车符 (\r) 的 STDOUT 流

    我正在编写一个简单的应用程序 它允许工作中的内部系统请求从远程服务器到使用 REST 调用发起的另一个远程服务器的复制过程 使用 rsync 我已经对express框架足够熟悉 并且刚刚开始尝试child process库 并偶然发现了一个
  • 重写规则,以便正确加载具有绝对路径的 css 和 js 文件

    我花了两个小时 但我无法弄清楚 我不知道如何谷歌解决方案 这是我在 htaccess 文件中的重写规则 RewriteCond REQUEST URI blog RewriteRule blog http localhost 2368 1
  • 如何使用 Karma 测试 NodeJS 后端代码(testaulous)

    如何设置 Karma 来运行我的后端单元测试 用 Mocha 编写 如果我将后端测试脚本添加到files 它未能说明require未定义 你不知道 Karma 仅用于测试基于浏览器的代码 如果您的项目在后端有 mocha 测试 在前端有 k
  • 获取对象数组中每个嵌套对象的虚拟属性?

    所以我知道如何获取单个虚拟属性 如 Mongoose 文档中所述 PersonSchema virtual name full get function return this name first this name last 但如果我的
  • 如何在 Google Translate Node.js 代码中设置 API KEY

    我正在尝试创建一个使用 Google Translate API 的 Node js 代码 我从以下代码中得到了谷歌文档 https cloud google com translate docs translating text 但是当我
  • JITSU 无法安装 OSX [节点 0.8.17 和 NPM 1.2.0] WTF

    我在通过 NPM 安装 jitsu 时遇到问题 我在 mac osx 10 6 8 上安装了节点 0 8 17 和 NPM 1 2 0 当我跑步时 sudo npm install jitsu g 首先它警告未找到自述文件 npm WARN
  • 如何使用 Playwright 使用选择器查找框架 (iframe)

    我有一个小问题 无法找到使用 Microsoft Playwright 框架的答案 根据您可以使用以下代码获取 iframe const frame page frame frame login 但是如何使用选择器来查找 iframe 并与
  • 使用 aws elastic beanstalk 将非 www 重定向到 www

    我正在使用 Elastic Beanstalk 并按照说明使用 Express Web 服务器部署我的应用程序 如下所示 http docs aws amazon com elasticbeanstalk latest dg create
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll
  • 如何将函数设置为 multer 上的限制参数?

    在这个问题之后 我可以使用 multer 和单个 html 表单上传不同文件夹中的多个文件吗 https stackoverflow com questions 39726862 cani upload many files in diff
  • 如何在 next-auth 中将数据添加到客户端 API?

    我目前正在使用凭据提供程序使用 next auth 进行授权 我有会话正在运行并且用户可以登录等 但是 在会话中我需要使用客户端 API 用户 名字 姓氏传递一些数据 用户名和电子邮件 默认情况下 客户端 API 传递名称 电子邮件和图像
  • Node Sass 没有绑定您当前的环境

    我在 SO 上看到过很多这样的问题 但似乎没有一个能解决或匹配问题 Node Sass 找不到适合您当前环境的绑定 带有 Node js 6 x 的 Windows 64 位 奇怪的是 我没有安装 Node js 6 x 从命令行 node
  • NodeJS Express Windows 最大连接数设置

    在哪里设置nodejs的最大连接数 用于使用express get 在 Windows 10 中 与linux中的最大文件 描述符 设置有关吗 有该设置的 Windows 版本吗 最好是在nodejs中进行设置 以便在迁移到unix时兼容
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • Node js,通过管道将 pdfkit 传输到内存流

    我在用pdfkit https github com devongovett pdfkit在我的节点服务器上 通常创建 pdf 文件 然后将它们上传到 s3 问题是 pdfkit 示例将 pdf 文档通过管道传输到节点写入流 该节点写入流将
  • 使用 Mongoose 无法找到按 ObjectId 搜索的文档

    Campaign find client id req param client id error campaigns gt if error response error error message else for campaign i

随机推荐

  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • “make clean”导致“没有规则使目标‘clean’”

    我运行的是 Ubuntu 10 04 每当我跑步时make clean 我明白了 make 没有规则可以使目标 干净 停止 这是我的生成文件 CC gcc CFLAGS g pedantic O0 std gnu99 m32 Wall PR
  • 如何实现 getSupportParentActivityIntent() 来动态设置 android 中向上按钮的活动[重复]

    这个问题在这里已经有答案了 Android中如何知道哪个父Activity调用了子Activity 假设我有三个活动 A B 和 C A 和 B 是父活动 C 是子活动 这意味着 C 可以从 A 或 B 启动 那么我如何知道哪个父活动导致启
  • 通过配对蓝牙打印机 Canon CP 900、CP 800 打印图像

    我需要将我的应用程序与配对的蓝牙设备连接 这将打印图像 via 蓝牙打印机 佳能 CP900 和 CP800 SELPHY And I 没有找到 any 佳能打印机 Android SDK任何帮助或链接都将是有意义的 我找到了这个link
  • 通过映射另一个 Observable 返回一个 Observable

    我正在尝试映射一个可观察值 从返回的可观察值中获取一个值 然后将该值输入到另一个可观察值中并返回该结果 这是我到目前为止所拥有的 getJobsByUser user User Observable
  • 将子类传递给方法但将超类作为参数?

    我有一个抽象类Vehicle有 2 个已实现的子类RedVehicle and YellowVehicle 在另一堂课上我有一个List
  • Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询

    我有一个看起来像这样的集合 id ObjectId 50a68673476427844b000001 other fields 我想做一个范围查询来查找两个日期之间的记录 我知道我可以通过执行以下操作从 mongo shell var 中的
  • 将 div 从父网站复制到 iframe 中的文本区域

    在谷歌翻译中 我制作了谷歌翻译的第二个实例 var makediv document createElement secondinstance makediv innerHTML makediv setAttribute id iframe
  • Serilog 缺少什么命名空间?

    I am able to use LoggerConfiguration in my C code with various Serilog Sinks but my compiler is complaining about the sp
  • PHP 中如何判断一个日期是否在两个日期之间?

    我需要知道是否 paymentDate 2010 年 12 月 31 日 有效期为 contractDateBegin 01 01 2001 和 contractDateEnd 01 01 2012 日 月 年格式 从 PHP 5 3 开始
  • Python HTMLParser:UnicodeDecodeError

    我正在使用 HTMLParser 来解析我用 urllib 下拉的页面 并且遇到了UnicodeDecodeError将某些传递给时的异常HTMLParser 我尝试使用chardet检测编码并转换为ascii or utf 8 the d
  • 改变div的背景颜色

    这很简单 我搜索过但找不到确切的答案 我想做的就是有一个 div 当你点击链接时它会改变颜色 我想要大约 3 或 4 种颜色选择 我该怎么做 Thanks 这是一个快速解决方案
  • 使用 SignalR 的 WCF 服务

    我有一个网络应用程序 仪表板上几乎没有图表 图表数据是在客户端调用 WCF 服务方法的 document ready 函数中获取的 我现在想要的是在我的应用程序中使用 SignalR 我对 SignalR 真的很陌生 我如何从 Signal
  • 如何进行内核线程通信?

    如何让内核模块中的线程进行通信 我正在编写一个内核模块 我的架构将使用三个需要通信的线程 到目前为止 我的研究使我相信唯一的方法是使用共享内存 声明全局变量 和锁定机制来同步线程之间的读 写 那里关于这方面的材料相当稀缺 我还有其他可以考虑
  • 当您的应用程序安装在 Android 上时,您可以运行 Intent 或脚本吗?

    例如 RPM 有 post postun pre preun 允许您编写在安装过程的不同阶段运行的脚本 我想做一些事情 比如在安装我的 Android 应用程序时创建和填充数据库 Ted 不 抱歉 这是明确不支持的
  • 将生成的进程的输出捕获到字符串

    背景 我正在开发一个程序 需要能够捕获stdout stderr以及程序的返回值 理想情况下 我希望将这些捕获到存储在对象内的字符串中 该对象保存过程的详细信息 我目前有一些代码 可以使用一些 在我看来 古老的 C 文件处理魔法将输出保存到
  • 向 AVM2 添加语言

    我对创建一种在 AVM2 上运行的语言很感兴趣 并且正在寻求从哪里开始的建议 我确实意识到这绝不是一项微不足道的任务 但我想尝试一下 至少在此过程中了解更多有关实现语言的知识 我一直在研究 ANTLR 并一直在阅读语言开发的语法问题 我正在
  • 我可以在循环内使用 useEffect 确保其尺寸恒定吗?

    我有一个功能性的 React 组件 更多的是非 React 对象的代理 如下所示 function ProxyComponent onEvent1 onEvent2 onEvent3 useEffect gt someObject on e
  • C# Windows 窗体自动关闭

    我有一个 Windows 应用程序 其中我的第一个 Windows 窗体是登录 成功登录后 必须打开 主页 表单 我在调试时看到 Home 表单 但是一旦代码进入 Home Designer cs 中的 Dispose 方法 我的应用程序就
  • Nodejs Express http 服务器如何处理并发请求?

    我正在构建一个 Node js 应用程序 并想了解如何处理并发请求 我构建了一个测试服务器 通过等待 10 秒来模拟高 CPU 负载 为了测试行为 我打开两个浏览器选项卡并同时刷新页面 const http require http con