首頁 > 後端開發 > Golang > 為什麼我的 Web 伺服器似乎被呼叫了偶數次?

為什麼我的 Web 伺服器似乎被呼叫了偶數次?

Susan Sarandon
發布: 2024-12-30 12:54:10
原創
947 人瀏覽過

Why Does My Web Server Seem to Be Called an Even Number of Times?

為什麼 Web 伺服器被呼叫偶數次?

在 Web 程式設計中,伺服器回應傳入的請求。然而,我們的簡單網頁伺服器被看似隨機偶數次呼叫。

底層請求

刷新頁面後,您可能會觀察到以下內容:

You've called me 1 times
You've called me 3 times
You've called me 5 times
....
登入後複製

發生這種情況是因為瀏覽器在後台發出額外的請求。一個常見的請求是 favicon.ico,一個通常顯示在網頁標題旁邊的圖示。

Web 伺服器回應

我們的 Web 伺服器不處理 favicon.ico 要求,導致瀏覽器不斷要求它。此請求會增加我們的計數器,從而導致偶數呼叫。

同步與控制

Go 使用 goroutine 並發處理請求。這可能會導致我們的程式碼中出現競爭條件,其中呼叫變數同時由多個 goroutine 遞增。為了防止這種情況,我們使用原子操作同步對變數的存取。

或者,我們可以透過檢查請求路徑並忽略不是發送到根端點的請求來防止計數器為每個請求遞增。

程式碼修復

為了確保準確的呼叫計數,我們可以同步存取呼叫變數或選擇性地忽略某些請求,例如favicon.ico:

// Use atomic operations
func HelloWorld(w http.ResponseWriter, r *http.Request) {
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}

// Ignore specific requests
func HelloWorld(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" || r.URL.Path == "/favicon.ico" {
        return
    }
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}
登入後複製

透過實施這些修改,我們的網頁伺服器將準確計算呼叫次數,而不管其他瀏覽器請求如何。

以上是為什麼我的 Web 伺服器似乎被呼叫了偶數次?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板