65

この単純なHTTPサーバーには、各リクエストに5秒かかるtime.Sleep()の呼び出しが含まれています。ブラウザに複数のタブをすばやくロードしようとすると、各リクエストがキューに入れられ、順番に処理されることは明らかです。同時リクエストを処理するにはどうすればよいですか?

package main

import (
   "fmt"
   "net/http"
   "time"
)

func serve(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintln(w, "Hello, world.")
   time.Sleep(5 * time.Second)
}

func main() {
   http.HandleFunc("/", serve)
   http.ListenAndServe(":1234", nil) 
}

実は、質問を書いた後、答えを見つけたばかりで、とても微妙です。グーグルで答えが見つからなかったので、とにかく投稿しています。私が間違っていることがわかりますか?

4

3 に答える 3

110

プログラムはすでにリクエストを同時に処理しています。abApache 2 に同梱されているベンチマーク ツールでテストできます。

ab -c 500 -n 500 http://localhost:1234/

私のシステムでは、ベンチマークで 500 件の同時リクエストすべてを処理するのに合計 5043 ミリ秒かかりました。ウェブサイトごとの接続数を制限するのはブラウザだけです.

ところで、Go プログラムのベンチマークはそれほど簡単ではありません。なぜなら、ベンチマーク ツールがボトルネックになっていないこと、および多くの同時接続を処理できることを確認する必要があるためです。したがって、2 台の専用コンピューターを使用して負荷を生成することをお勧めします。

于 2012-05-23T15:15:53.300 に答える
13

Server.go から、接続が受け入れられると、 go ルーチンが Serve 関数で生成されます。以下はスニペットです:-

// Serve accepts incoming connections on the Listener l, creating a 
// new service goroutine for each.  The service goroutines read requests and
// then call srv.Handler to reply to them.
func (srv *Server) Serve(l net.Listener) error {
        for {
            rw, e := l.Accept()
               if e != nil {
......
            c, err := srv.newConn(rw)
            if err != nil {
                continue
            }
            c.setState(c.rwc, StateNew) // before Serve can return
            go c.serve()
        }
}
于 2015-11-24T09:05:44.657 に答える
-6

xhr リクエストを使用する場合は、xhr インスタンスがローカル変数であることを確認してください。

たとえば、xhr = new XMLHttpRequest()はグローバル変数です。同じ xhr 変数で並列リクエストを行うと、1 つの結果しか受け取りません。したがって、このようにローカルで xhr を宣言する必要がありますvar xhr = new XMLHttpRequest()

于 2016-06-15T22:22:02.010 に答える