为了账号安全,请及时绑定邮箱和手机立即绑定

同步。互斥体或互斥体。句柄不工作

同步。互斥体或互斥体。句柄不工作

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 的数字。请告诉我我做错了什么,或者如果我对同步方式有误解。互斥体或互斥体。句柄()工作。
查看完整描述

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 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号