我遇到了節點問題,對于我添加到并行佇列的每個網路請求,直到我獲得網路回應的時間都會增加幾毫秒,這正常嗎?如果是這樣,請告訴我為什么,他們不應該花同樣的時間來回應嗎?
設定:
本地回應服務器始終提供相同的 300KB JSON 回應。
查詢方式:
const Q = require('q')
let queue = []
for (var i = 100; i > 0; i--) {
queue.push(getDamageInfo())
}
Q.allSettled(queue)
.then((result) => {})
const Q = require('q')
const request = require('request')
function getDamageInfo() {
id = '79d568d6-b820-40b4-845a-02228dcde338'
url = 'http://localhost:3001/damage/'
let deferred = Q.defer()
let start = new Date()
request.get(url id , {
'auth': {
'bearer': token
}
}, (err, res, body) => {
let end = new Date() - start
console.log('get-damage-info: ' id ' %dms', end)
if(res.statusCode != 200) {
deferred.reject({statusCode: res.statusCode, error: err })
} else {
deferred.resolve(JSON.parse(body))
}
})
return deferred.promise
}
控制臺輸出:
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 43ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 44ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 46ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 48ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 51ms
.
.
.
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 223ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 224ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 225ms
我不明白為什么回應時間已經增加了近 10 毫秒,從請求 1 到請求 5 的 5 個并行請求。所有嘗試過的庫(https、axios、請求)都會發生這種情況。
提前謝謝你,祝你有美好的一天
uj5u.com熱心網友回復:
事實上,這是預料之中的。對于任何技術,您都會看到相同的結果,這是很自然的,您發送到服務器的并發請求越多,它最終需要處理它們的時間就越多。
您的測驗代碼發送 100 個并發請求。
您需要了解 Node.js 的資源量也是有限的,并且最終libuv為 Node.js 實作異步的庫使用了一個執行緒池,并且有一個它必須執行的作業佇列。因此,佇列中的作業越多,您在作業完成前需要等待的時間就越多。實際上有多個佇列,但這是一個實作細節。
此外,最后還有一些硬體限制,例如您的 CPU 中擁有全部 4 個內核,因此所有作業都由您的 CPU 執行。當您的計算機有更多作業要做時,它不會增加內核數量,而是會減少整體回應時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338987.html
上一篇:如何確定哪個處理器的性能最高
