用http.HandleFunc实现了一个http服务器,接受浏览器访问,浏览器的每次请求都会带1个参数logid,每个请求的logid都是唯一的。
对于每次请求,http服务器的处理步骤是:main.go接受参数logid,随后依次跳转到不同的go文件处理,每个go文件又会经过多个不同函数处理,处理过程中遇到异常情况会将logid写到日志文件。
现在问题是:在高并发情况下,如何保证写入日志文件中的logid对应的是相应的请求?比如先后来了两个请求1和2,分别对应的logid是10001和10002,如果用全局变量LOGID来存放logid,那么请求1先到,LOGID被赋值为10001,随后请求2到时LOGID被重新赋值成了10002,此时如果请求1出现异常,就会把10002写到日志文件中(但其实请求1对应的logid应该是10001)。
放假好久没看论坛了。快下班草草写了个,将就看吧,不知道合不合你意思。如果要每个session 一个id的话,就弄个 map[session]*Req。
```go
package main
import (
"io"
"log"
"math/rand"
"net/http"
"strconv"
)
type Req struct {
logid string
}
// hello world, the web server
func mainHandle(w http.ResponseWriter, req *http.Request) {
r := NewReq()
msg := r.subHandle()
io.WriteString(w, msg)
}
func (r *Req) subHandle() string {
return r.logid + "hello"
}
func main() {
http.HandleFunc("/hello", mainHandle)
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
func NewReq() *Req {
r := &Req{
logid: strconv.Itoa(rand.Intn(10000)), //此处由专门的生成器生成,每次不一样
}
return r
}
```
#9
更多评论