31901


GO言語に入門して、よくある簡易なHTTPサーバを写経しました。

そこで湧いた疑問なのですが、  
応答を返すのに時間がかかってしまっている最中に別の要求が来た場合どうなるか、  
というものです。例えばDBアクセスに時間がかかり応答が遅いようなケースです。

試しに以下で実験してみました。

[code]

    package main
    
    import (
        "fmt"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        fmt.Println("start handler")
        for {
            // 無限ループ（とても長い処理）
        }
    }
    
    func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8080", nil)
    }
    
[/code]

ブラウザでlocalhost:8080にアクセスすると、  
標準出力に"start handler"が出力され、ブラウザは応答を待ち続けています。

続けて別のタブを開いてアクセスすると、  
今度は標準出力への出力はなく、ブラウザは応答を待ち続けています。

さらに最初のタブに戻ってブラウザの中止ボタンを押すと、  
ようやく標準出力に"start handler"が出力されました。

つまり、２番目にアクセスしてきた人は最初にアクセスしてきた人への応答処理が終わるまで  
待たなければならない、ということかと思います。

質問です。

このWebサーバを実際に多人数で利用すると性能的に問題があると思うのですが、  
これはあくまで説明用の簡易的なものであり、実際にはそのような問題が起きないような仕組みで  
実装するものなのでしょうか。


CC BY-SA 3.0
2017-01-17T01:07:21.657
31896
2017-01-20T00:58:36.567
19759
question
go
GO言語 http応答を返す前に別の要求が来た場合


自己回答です。

この事象はHTTPサーバは無関係で、ブラウザのタブの挙動が理由でした。

例えば、２回目のアクセスをブラウザの別のタブからではなく、別のブラウザを使うと"start
handler"が表示されました。また、curlコマンドでアクセスした場合も、都度"start handler"が表示されます。

そもそも、タブで２回目のアクセスをする際に開発ツールでネットワークを見てみると、サーバに要求していないようです（chromeにて）。この辺りの正確な仕様は分かりませんが、別の話題となりますので質問はクローズします。


CC BY-SA 3.0
2017-01-17T04:00:05.637
31901
2017-01-20T00:58:36.567
2017-01-20T00:58:36.567
19759
19759
31896
answer