我的代码有什么问题(IO等待)?
我设计我的中间件但在运行命令时遇到错误(IO等待):
ab -c 100 -n 100000 -k http://127.0.0.1:10000/
完整代码如下: https://github.com/HeadwindFly/examples/blob/master/middleware.go
答案 0 :(得分:1)
第一:没有理由反映在这里。与您的问题无关,但不需要。
在Context的设置中,您正在使用ctx的全局变量。
go的http服务器是并发的,所以你正在做的是让多个goroutines更新相同的全局变量,然后将其传递给处理程序。
这会导致处理程序有时获得相同的ResponseWriter实例并尝试写入它。这可能导致ab
失败,因为您通过混合在线路上发送的内容来编写无效的http响应。
摆脱全局ctx变量并使用本地变量,如下所示:
func handler(rw http.ResponseWriter, r *http.Request) {
ctx := &Context{ // notice that this is a local var now
names:make([]string, 0),
rw:rw,
r:r,
}
for i := 0; i < len(middlewareInfos); i++ {
middleware := reflect.New(middlewareInfos[i].t)
setContextMethod := middleware.MethodByName("SetContext")
setContextMethod.Call([]reflect.Value{reflect.ValueOf(ctx)})
handleMethod := middleware.MethodByName("Handle")
values := handleMethod.Call([]reflect.Value{})
if value, ok := values[0].Interface().(bool); !ok || !value {
return
}
}
// fmt.Printf("%v\n", ctx)
fmt.Fprint(rw, "Hello World.")
}