亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 HTTP 請求總是需要與完全超時一樣長的時間?

為什么 HTTP 請求總是需要與完全超時一樣長的時間?

Go
GCT1015 2023-08-14 15:02:50
我正在制作一個 _golang git bruteforcer。它的行為有點奇怪,我想這與并發有關。?sync.WaitGroup這是代碼:package mainimport { <snipped for brevity> }// ReadFile : Reads File and returns it's contentsfunc ReadFile(fileName string) []string { <snipped for brevity> }func joinString(strs ...string) string { <snipped for brevity> }// MakeRequest : Makes requests concurrentlyfunc MakeRequest(client *http.Client, url string, useragent string, ch chan<- string, wg *sync.WaitGroup) {? ? defer wg.Done()? ? // start := time.Now()? ? request, err := http.NewRequest("GET", url, nil)? ? if err != nil {? ? ? ? fmt.Println(err)? ? ? ? return? ? }? ? request.Header.Set("User-Agent", useragent)? ? response, err := client.Do(request)? ? if err != nil {? ? ? ? return? ? }? ? // secs := time.Since(start).Seconds()? ? if response.StatusCode < 400 {? ? ? ? // fmt.Printf("Time elapsed %f", secs)? ? ? ? bodyBytes, err := ioutil.ReadAll(response.Body)? ? ? ? if err != nil {? ? ? ? ? ? log.Fatal(err)? ? ? ? }? ? ? ? defer response.Body.Close()? ? ? ? bodyString := string(bodyBytes)? ? ? ? notGit, err := regexp.MatchString("<html>", strings.ToLower(bodyString))? ? ? ? if !notGit && len(bodyString) > 0 { // empty pages and html pages shouldn't be included? ? ? ? ? ? fmt.Println(bodyString)? ? ? ? ? ? ch <- fmt.Sprintf(" %s ", Green(url))? ? ? ? }? ? }}在職的 :它從文件中讀取 url 并/.git, /.git/HEAD, /.git/description, /.git/index在網絡服務器上進行檢查。問題:?如果我將http.Client超時更改為2 seconds它將在 2 秒內完成,如果是 50 秒它將等到 50 秒,輸入文件是否包含 10 個 url 或 500 個 url 并不重要。我的理解是,如果有更多的 url,它將等到 goroutine 傳遞的最后一個 URL 超時。
查看完整描述

1 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

在代碼中,您從文件中讀取 URL,然后并行觸發所有這些 URL 的請求,然后等待所有并行請求完成。

所以這實際上是有道理的,并不表明存在問題:

如果我將 http.Client 超時更改為 2 秒,它將在 2 秒內完成,如果是 50 秒,它將等到 50 秒,輸入文件是否包含 10 個 url 或 500 個 url 并不重要。

假設您的文件有 500 個 URL。

您并行觸發 500 個請求...然后等待所有請求完成(請記住,它們都是并行執行的)。那需要多長時間?

在最壞的情況下(所有請求都在 50 秒超時),總共只需要 50 秒(因為它們都在并行等待這 50 秒)。

在最好的情況下(所有請求都成功通過且沒有超時),應該需要幾秒鐘。

在一般情況下,您可能會看到(在 50 秒處出現幾次超時),然后需要 50 秒(在最壞的情況下,您將等待這幾個請求并行等待這 50 秒)。


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號