无法实现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,因为它确实会增加运行时开销。