3

如果我有一个看起来像这样的 jQuery POST 调用:

$.post(url : "myserver/1", data : params, success: function () { 
    $.post(url : "myserver/2", data : params2); 
});

这将打开多少个 HTTP 连接?我假设它打开2。

我正在尝试复制网页在 Python 脚本中的功能(作为性能测试类型脚本)。如果我这样做会快得多:(伪代码)

for i in 0 to 5000:
     Open HTTP Connection
     POST
     POST
     Close HTTP Connection

对比

for i in 0 to 5000:
     Open HTTP Connection
     POST
     Close
     Open HTTP Connection
     POST
     Close

我假设第二个测试是浏览器会做的事情。我本质上想复制 5000 次点击(背靠背)到页面的速度。显然我可以并行化这个任务——但这不是我在这里寻找的

现在,假设 jquery 正在建立 2 个 HTTP 连接,是否有一种简单的方法来维护持久连接?

4

1 回答 1

5

jQuery 无法控制连接数 - 浏览器会打开任意数量的连接(通常为 2-8),然后通过它们推送您的请求。您的代码可能只会打开一个连接,因为您在启动第二个请求之前正在等待第一个请求完成。

当然,您不能在 javascript 中使用线程,但您可以一次发起任意数量的请求,这可以最大限度地增加浏览器允许的连接数。

你可能想要这样的东西:

var CONCURRENCY=4, qty = 5000, cnt = 0
function testOnce() {
  cnt = cnt + 1;
  if (cnt >= qty) { return; }
  $.post(url : "myserver/" + cnt, data : params, success: testOnce)
}
for (var i=0; i<CONCURRENCY; i++) {
  testOnce()
}

即使这样,您也只会打开几个连接并通过这些连接发送所有请求。这不会真正为您的服务器应用程序提供您正在寻找的打击,包括 tcp 设置和拆卸。浏览器是专门设计用来避免敲打任何一台服务器的。如果您发出过多的请求,它们最终会在浏览器的网络管理器中等待可用的连接。

如果你在服务器上禁用 http keep-alive,你会更接近,但这可能是不可能的,或者可能会影响结果。禁用它后,每个请求都将被迫建立一个新的连接。但这是不切实际的悲观。这一切都取决于。现实的负载测试并不那么容易。但通常你不需要它那么现实——你真正想要测试的是什么?

Wireshark将向您展示真正发生的事情的细节。

于 2012-06-28T23:22:44.753 回答