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 упомянуто, пустой цикл должен быть выполнен в отдельном потоке, и другие циклы не должны быть затронуты занятым циклом. Что не так в моем понимании?