我正在使用教科書:“Go編程語言”,其中他們展示了如何使用Go制作Web服務器。按照他們給出的代碼,我做了一個Web服務器:package mainimport ( "fmt" "log" "net/http" "sync")var mu sync.Mutexvar count intfunc main() { http.HandleFunc("/", handler) http.HandleFunc("/count", counter) log.Fatal(http.ListenAndServe("localhost:8080", nil))}func handler(w http.ResponseWriter, r *http.Request) { mu.Lock() count++ mu.Unlock() fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)}func counter(w http.ResponseWriter, r *http.Request) { mu.Lock() fmt.Fprintf(w, "Count %d\n", count) mu.Unlock()}之后,我想用 goroutines 測試我的知識,所以我制作了一個程序,將服務器端點調用:“/rest”1000 次。然后我調用端點:“/count”,它假設返回調用前一個端點的次數。send.gopackage mainimport ( "fmt" "net/http" "os" "strconv" "io/ioutil")func main() { times, _ := strconv.Atoi(os.Args[1]) for i := 0; i < times; i++ { go call() } response, err := http.Get("http://localhost:8080/count") if err != nil { fmt.Println("ERROR ", err) } text, _ := ioutil.ReadAll(response.Body) fmt.Println(string(text)) response.Body.Close()}func call() { _, _= http.Get("http://localhost:8080/rest")}問題是這樣的:/count 終結點返回一個小于 1000 的數字。請告訴我我做錯了什么,或者如果我對同步方式有誤解?;コ怏w或互斥體。句柄()工作。
2 回答

子衿沉夜
TA貢獻1828條經驗 獲得超3個贊
sync.Mutex
并且正在按預期工作,但每個處理程序都在自己的 go-例程中運行。不能保證任何調用都在調用之前運行,無論它們發布到服務器的順序如何。http.HandleFunc
handler
count
在測試程序中,您可以刪除前面的關鍵字,該關鍵字將確保所有請求都串聯運行,因為等待服務器返回。或者,您可以使用注釋中建議的方式,這將允許并行處理請求,但在發送計數請求之前等待它們全部完成。go
call()
Get()
WaitGroup
- 2 回答
- 0 關注
- 112 瀏覽
添加回答
舉報
0/150
提交
取消