- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个 Node 性能的小型演示,我很惊讶地看到以下示例对 setTimeout
的 50 个并发调用花费了 4 秒而不是 500 毫秒。
以下代码设置了一个非常简单的快速服务器,它监听所有请求,并在 500 毫秒后使用 setTimeout
响应。然后它有一个客户端发出 50 个请求,传递一个数字来跟踪请求和相应的响应。
// SERVER
var express = require('express');
var app = express();
app.get('*', function (req, res) {
setTimeout(function () {
return res.send(req.query.i);
}, 500);
});
app.listen(8099);
// CLIENT
var http = require('http');
function start() {
for (var i = 0; i < 50; i++) {
console.log(new Date().getSeconds() + ':' + new Date().getMilliseconds() + ' - Sending ' + i);
http.get('http://localhost:8099?i=' + i, responseHandler);
}
function responseHandler(res) {
res.on('data', function (body) {
return console.log(new Date().getSeconds() + ':' + new Date().getMilliseconds() + ' - Received ' + body);
});
}
}
start();
我预计代码会花费 30-50 毫秒来完成所有 setTimeout
调用,然后在 500 毫秒后,所有这些调用都会在大约同一时间做出响应。相反,我看到他们以 5 人为一组进行响应,每组 5 人之间间隔 500 毫秒。
我尝试了一些更简单的替代方案,它们都解决了这个问题。如果我取出 setTimeout
并立即响应,所有 50 个响应都会在 100 毫秒内完成。如果我将 Web 服务器排除在等式之外,只对 setTimeout
进行 50 次调用,那么所有 50 次调用都会立即排队,并且所有 50 次调用会在 500 毫秒后同时返回。
当 express 和 http 调用与 setTimeout
结合使用时,可能会导致额外延迟的原因是什么?
最佳答案
这个问题与 setTimeout
无关(正如您在没有客户端/服务器设置的情况下运行测试时可能已经猜到的那样)。问题是 Node http
服务器在任何给定时间将处理的打开的 HTTP 套接字的数量。
控制它的设置是 Agent.maxSockets
(有关更多信息,请参阅 documentation)。
maxSockets
的默认值为 5。因此,如果您向您的应用发送 50 个请求,它将一次处理其中的 5 个,直到它们完成,然后再继续处理新请求。由于它们在 setTimeout
函数调用它们的回调之前无法完成,因此您的请求将以大约每 500 毫秒 5 次的突发响应。
如果你想证明这一点,你所要做的就是改变 maxSockets
的值:
http.globalAgent.maxSockets = 10;
现在您会看到请求以 10 个为一组的方式处理。如果您将它设置为 50,您应该会看到您正在寻找的行为。
请注意,它可能设置为 5 是有充分理由的,所以我不认为您的问题的“解决方案”只是将 maxSockets
设置为 Infinity
或像那样可怕的东西。
mscdex 在评论中指出,您可以在 http.request
中指定一个 cusotm 代理,并且还会对 Node 中的默认 maxSockets
进行更改v0.12.
关于javascript - 对 setTimeout 的并发调用导致比预期更多的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24714572/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!