Http-сервер Golang блокирует, когда запускает бесконечный цикл

Как я узнал из golang docs, если я установил runtime.GOMAXPROCS (8) с процессором из 8 ядер (intel i7), то запустил goroutine с бесконечным циклом, другие gorutines не должны быть заблокированы, потому что есть достаточно потоков и goprocs. Но это не так при использовании пакета net / http, процедура бесконечного цикла заблокирует http-сервер после нескольких вызовов. Может кто-нибудь помочь объяснить, почему?

Если я прокомментирую строку «идти бесконечный цикл», запустите клиент за сервером, клиент выдаст 1000 звездочек; но если я включу goroutine, клиент заблокирует после печати несколько звездочекЯ попытался добавить runtime.LockOSThread () в goroutine, кажется, что не работаетМоя среда: osx 10.10, версия go go 1.3.3 darwin / amd64

Код сервера:

package main

import (
    "fmt"
    "log"
    "net/http"
    "runtime"
)

func myHandler(w http.ResponseWriter, req *http.Request) {
    w.Write([]byte("hello"))
}

func infiniteloop() {
    for {

    }
}

func main() {
    // set max procs for multi-thread executing
    runtime.GOMAXPROCS(runtime.NumCPU())

    // print GOMAXPROCS=8 on my computer
    fmt.Println("GOMAXPROCS=", runtime.GOMAXPROCS(-1))
    http.Handle("/", http.HandlerFunc(myHandler))

    // uncomment below line cause server block after some requests 
    // go infiniteloop()
    if err := http.ListenAndServe(":8280", nil); err != nil {
        log.Fatal(err)
    }
}

Код клиента:

package main
import (
    "fmt"
    "net/http"
)

func getOnce() {
    if resp, err := http.Get("http://localhost:8280"); err != nil {
        fmt.Println(err)
        return
    } else {
        defer func() {
            if err := resp.Body.Close(); err != nil {
                fmt.Println(err)
            }
        }()
        if resp.StatusCode != 200 {
            fmt.Println("error codde:", resp.StatusCode)
            return
        } else {
            fmt.Print("*")

        }
    }
}

func main() {
    for i := 1; i < 1000; i++ {
        getOnce()
        if i%50 == 0 {
            fmt.Println()
        }
    }

}

Теперь я знаю, почему такой цикл emtpy блокирует другие goroutines, но почемуruntime.LockOSThread() тоже не помогает?

func infiniteloop() {
    // add LockOSThread will not help
    runtime.LockOSThread()
    for {
    }
}

Какhttp://golang.org/pkg/runtime/#LockOSThread упомянуто, пустой цикл должен быть выполнен в отдельном потоке, и другие циклы не должны быть затронуты занятым циклом. Что не так в моем понимании?

Ответы на вопрос(2)

Ваш ответ на вопрос