无法实现http请求并行
Can't achieve http request parallelism
我有一个用 Node 编写的应用程序,它以循环方式向一个 Web 服务器发送 Http 请求,并记录它每 1 秒收到多少请求。我的问题是我每秒最多只能收到 10 个请求,考虑到我有 216 个可用端口和大 upload/download 速度,这绝对是低的。当我使用其他一些支持多线程的低级语言时,例如 Java,我设法每秒获得大约 600-700 个请求,这远远超过这个数字。我的代码非常简单,我唯一做的就是无限循环并向 Web 服务器发送请求,作为响应,增加一个全局变量,我每 1 秒打印一次以了解有多少请求返回。
async function sendTestRequest() {
var uUrl = 'https://sometestwebserver.io/';
axios.get(uUrl, {
jar: cookieJar, // tough.CookieJar or boolean
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Connection': 'keep-alive',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
},
withCredentials: true
}).then(response => {
bmak.globalCnt++;
}).catch(error => {
console.log(error);
})
};
async function main() {
bmak.globalCnt = 0;
var currDate = Date.now();
for (let w = 0; 1 == 1; w++) {
sendTestRequest()
if (Date.now() - currDate >= 1000) {
console.log("Received requests: " + bmak.globalCnt);
currDate = Date.now();
}
continue;
}}
我敢打赌,这是因为您的 main()
正在耗尽事件循环。它无限地同步调用 sendTestRequest
,从不放弃对 JavaScript 线程的控制以供 I/O 处理。
我会修改它以获得最大并发性。 main()
应该调用 sendTestRequest()
那个次数,然后当您的 HTTP 请求完成时(即在 then
/catch
回调中),再次调用 sendTestRequest
。
然后您可以进行一些试验以找到能获得最佳性能的并发数。
PS:本例中使用的 async
完全没有必要,因为您实际上并没有 await
任何承诺。除非确实需要,否则不应使用 async
,因为它确实会增加运行时开销。
我有一个用 Node 编写的应用程序,它以循环方式向一个 Web 服务器发送 Http 请求,并记录它每 1 秒收到多少请求。我的问题是我每秒最多只能收到 10 个请求,考虑到我有 216 个可用端口和大 upload/download 速度,这绝对是低的。当我使用其他一些支持多线程的低级语言时,例如 Java,我设法每秒获得大约 600-700 个请求,这远远超过这个数字。我的代码非常简单,我唯一做的就是无限循环并向 Web 服务器发送请求,作为响应,增加一个全局变量,我每 1 秒打印一次以了解有多少请求返回。
async function sendTestRequest() {
var uUrl = 'https://sometestwebserver.io/';
axios.get(uUrl, {
jar: cookieJar, // tough.CookieJar or boolean
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Connection': 'keep-alive',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
},
withCredentials: true
}).then(response => {
bmak.globalCnt++;
}).catch(error => {
console.log(error);
})
};
async function main() {
bmak.globalCnt = 0;
var currDate = Date.now();
for (let w = 0; 1 == 1; w++) {
sendTestRequest()
if (Date.now() - currDate >= 1000) {
console.log("Received requests: " + bmak.globalCnt);
currDate = Date.now();
}
continue;
}}
我敢打赌,这是因为您的 main()
正在耗尽事件循环。它无限地同步调用 sendTestRequest
,从不放弃对 JavaScript 线程的控制以供 I/O 处理。
我会修改它以获得最大并发性。 main()
应该调用 sendTestRequest()
那个次数,然后当您的 HTTP 请求完成时(即在 then
/catch
回调中),再次调用 sendTestRequest
。
然后您可以进行一些试验以找到能获得最佳性能的并发数。
PS:本例中使用的 async
完全没有必要,因为您实际上并没有 await
任何承诺。除非确实需要,否则不应使用 async
,因为它确实会增加运行时开销。