我正在使用教科書(shū):“Go編程語(yǔ)言”,其中他們展示了如何使用Go制作Web服務(wù)器。按照他們給出的代碼,我做了一個(gè)Web服務(wù)器: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 測(cè)試我的知識(shí),所以我制作了一個(gè)程序,將服務(wù)器端點(diǎn)調(diào)用:“/rest”1000 次。然后我調(diào)用端點(diǎn):“/count”,它假設(shè)返回調(diào)用前一個(gè)端點(diǎn)的次數(shù)。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")}問(wèn)題是這樣的:/count 終結(jié)點(diǎn)返回一個(gè)小于 1000 的數(shù)字。請(qǐng)告訴我我做錯(cuò)了什么,或者如果我對(duì)同步方式有誤解?;コ怏w或互斥體。句柄()工作。
2 回答

子衿沉夜
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
sync.Mutex
并且正在按預(yù)期工作,但每個(gè)處理程序都在自己的 go-例程中運(yùn)行。不能保證任何調(diào)用都在調(diào)用之前運(yùn)行,無(wú)論它們發(fā)布到服務(wù)器的順序如何。http.HandleFunc
handler
count
在測(cè)試程序中,您可以刪除前面的關(guān)鍵字,該關(guān)鍵字將確保所有請(qǐng)求都串聯(lián)運(yùn)行,因?yàn)榈却?wù)器返回?;蛘撸梢允褂米⑨屩薪ㄗh的方式,這將允許并行處理請(qǐng)求,但在發(fā)送計(jì)數(shù)請(qǐng)求之前等待它們?nèi)客瓿伞?code>gocall()
Get()
WaitGroup
- 2 回答
- 0 關(guān)注
- 119 瀏覽
添加回答
舉報(bào)
0/150
提交
取消