9

私は go HTTP パッケージで遊んでいました。Javaで行うように、リクエストを並行して処理したかったのです。しかし、私はできませんでした。

私は単純な Web サーバーを作成し、途中でスリープ状態にし、一度に 1 つのリクエストを処理することに気付きました。そのため、ブラウザで更新を行った場合、最初のリクエストのプロセスは、2 番目のリクエストの処理が開始されるまで終了する必要があります。コードは次のとおりです。

func main(){

    //Process the http commands
    fmt.Printf("Starting http Server ... ")
    http.Handle("/", http.HandlerFunc(sayHello))
    err := http.ListenAndServe("0.0.0.0:8080", nil)
    if err != nil {
        fmt.Printf("ListenAndServe Error",err)
    }
}

func sayHello(c http.ResponseWriter, req *http.Request) {
    fmt.Printf("New Request\n")
    processRequest(c, req)
}

func processRequest(w http.ResponseWriter, req *http.Request){
    time.Sleep(time.Second*3)
    w.Write([]byte("Go Say’s Hello(Via http)"))
    fmt.Println("End")
}

両方のリクエストを並行して処理したかったので、異なる gorutine で各リクエストを処理するために、「sayHello」関数の「processRequest(c, req)」の前に「go」コマンドを追加しました。でも...うまくいかない....理由はわかりません。コンソールに印刷された行が表示されるため、両方の要求が処理されていることがわかりますが、ブラウザーは情報を待機し続けます.....そして応答を表示しません。

それで...私の質問は、

各リクエストは新しい http.ResponseWriter を作成しますか? それとも同じものを使用していますか?各リクエストを異なるスレッドで処理するように Web サーバーに指示する方法を知っていますか?

どんな助けも大歓迎です....

フェルスカ

4

3 に答える 3

21

すべての接続は自動的に同時に処理されます。各TCP接続(要求ではない)は、独自のゴルーチンを取得します。

httpパイプラインと接続を再利用するブラウザがある世界では、これが常にうまくいくとは限りません。ほとんどの場合、ブラウザは接続を再利用しており、ゴルーチンによって処理されている現在のリクエストが終了するまで接続を停止します。

于 2012-06-25T23:47:57.820 に答える
0

ランタイム サポートが複数の OS スレッドを利用できるようにするには、次の方法でその数を設定できます。

 runtime.GOMAXPROCS(n)

または GOMAXPROCS 環境変数を設定します。

使用可能なコアの数を取得するには、次を使用します

 runtime.NumCPU()

だからあなたはしばしば

 runtime.GOMAXPROCS(runtime.NumCPU())
于 2013-07-29T18:04:27.907 に答える