ホームページ > バックエンド開発 > Golang > Web サーバーが偶数回呼び出されているように見えるのはなぜですか?

Web サーバーが偶数回呼び出されているように見えるのはなぜですか?

Susan Sarandon
リリース: 2024-12-30 12:54:10
オリジナル
931 人が閲覧しました

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

Web サーバーが偶数回呼び出されるのはなぜですか?

Web プログラミングでは、サーバーは受信リクエストに応答します。ただし、この単純な Web サーバーは一見ランダムな偶数回呼び出されます。

内部リクエスト

ページを更新すると、次のような現象が発生する可能性があります:

You've called me 1 times
You've called me 3 times
You've called me 5 times
....
ログイン後にコピー

これは、ブラウザがバックグラウンドで追加のリクエストを行うために発生します。よくあるリクエストの 1 つは、通常 Web ページのタイトルの横に表示されるアイコンである favicon.ico に対するものです。

Web サーバーの応答

当社の Web サーバーは favicon.ico リクエストを処理しません。ブラウザーによって継続的に要求される必要があります。このリクエストによりカウンターがインクリメントされ、偶数番号の呼び出しが行われます。

同期と制御

Go はゴルーチンを使用してリクエストを同時に処理します。これにより、コード内で競合状態が発生する可能性があり、複数の goroutine によって call 変数が同時にインクリメントされます。これを防ぐために、アトミック操作を使用して変数へのアクセスを同期します。

あるいは、リクエスト パスをチェックし、ルート エンドポイント宛てではないリクエストを無視することで、リクエストごとにカウンタが増加するのを防ぐこともできます。

>

コード修正

正確な呼び出しカウントを確保するには、calls 変数へのアクセスを同期するか、選択的に行うことができます。 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 サーバーは追加のブラウザ リクエストに関係なく、呼び出しを正確にカウントします。

以上がWeb サーバーが偶数回呼び出されているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート