質問: GO言語に入門して、よくある簡易なHTTPサーバを写経しました。 そこで湧いた疑問なのですが、 応答を返すのに時間がかかってしまっている最中に別の要求が来た場合どうなるか、 というものです。例えばDBアクセスに時間がかかり応答が遅いようなケースです。 試しに以下で実験してみました。 ``` 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) } ``` ブラウザでlocalhost:8080にアクセスすると、 標準出力に"start handler"が出力され、ブラウザは応答を待ち続けています。 続けて別のタブを開いてアクセスすると、 今度は標準出力への出力はなく、ブラウザは応答を待ち続けています。 さらに最初のタブに戻ってブラウザの中止ボタンを押すと、 ようやく標準出力に"start handler"が出力されました。 つまり、2番目にアクセスしてきた人は最初にアクセスしてきた人への応答処理が終わるまで 待たなければならない、ということかと思います。 質問です。 このWebサーバを実際に多人数で利用すると性能的に問題があると思うのですが、 これはあくまで説明用の簡易的なものであり、実際にはそのような問題が起きないような仕組みで 実装するものなのでしょうか。
回答: 自己回答です。 この事象はHTTPサーバは無関係で、ブラウザのタブの挙動が理由でした。 例えば、2回目のアクセスをブラウザの別のタブからではなく、別のブラウザを使うと"start handler"が表示されました。また、curlコマンドでアクセスした場合も、都度"start handler"が表示されます。 そもそも、タブで2回目のアクセスをする際に開発ツールでネットワークを見てみると、サーバに要求していないようです(chromeにて)。この辺りの正確な仕様は分かりませんが、別の話題となりますので質問はクローズします。