亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同步?;コ怏w或互斥體。句柄不工作

同步?;コ怏w或互斥體。句柄不工作

Go
泛舟湖上清波郎朗 2022-09-26 15:31:11
我正在使用教科書:“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貢獻1784條經驗 獲得超2個贊

互斥體僅確保沒有兩個戈魯廷同時寫入/讀取,但它不控制這些戈魯廷的執行順序。count

這意味著您的代碼中沒有任何內容可以確保在執行之前完成所有操作。go call()http.Get(".../count")

如果只想在完成所有操作執行,則可以使用同步來執行此操作。等待組。http.Get(".../count")go call()


查看完整回答
反對 回復 2022-09-26
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

sync.Mutex并且正在按預期工作,但每個處理程序都在自己的 go-例程中運行。不能保證任何調用都在調用之前運行,無論它們發布到服務器的順序如何。http.HandleFunchandlercount

在測試程序中,您可以刪除前面的關鍵字,該關鍵字將確保所有請求都串聯運行,因為等待服務器返回。或者,您可以使用注釋中建議的方式,這將允許并行處理請求,但在發送計數請求之前等待它們全部完成。gocall()Get()WaitGroup


查看完整回答
反對 回復 2022-09-26
  • 2 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號