我的代码有什么问题(IO 等待)?

我的代码有什么问题(IO 等待)?

我设计了我的中间件,但在运行命令时遇到了错误(IO 等待):

ab -c 100 -n 100000 -k  http://127.0.0.1:10000/

完整代码如下: https ://github.com/HeadwindFly/examples/blob/master/middleware.go


慕的地6264312
浏览 171回答 1
1回答

HUWWW

第一:这里没有理由使用反射。与您的问题无关,但不需要。在您的 Context 设置中,您使用的是 ctx 的全局变量。go 的 http 服务器是并发的,所以你正在做的是让多个 goroutine 更新同一个全局变量,然后将它传递给处理程序。这会导致您的处理程序有时会获得相同的 ResponseWriter 实例并尝试对其进行写入。这可能会导致ab失败,因为您通过混合在线上发送的内容来编写无效的 http 响应。摆脱全局 ctx 变量并使用本地变量,如下所示:func handler(rw http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; ctx := &Context{ // notice that this is a local var now&nbsp; &nbsp; &nbsp; &nbsp; names:make([]string, 0),&nbsp; &nbsp; &nbsp; &nbsp; rw:rw,&nbsp; &nbsp; &nbsp; &nbsp; r:r,&nbsp; &nbsp; }&nbsp; &nbsp; for i := 0; i < len(middlewareInfos); i++ {&nbsp; &nbsp; &nbsp; &nbsp; middleware := reflect.New(middlewareInfos[i].t)&nbsp; &nbsp; &nbsp; &nbsp; setContextMethod := middleware.MethodByName("SetContext")&nbsp; &nbsp; &nbsp; &nbsp; setContextMethod.Call([]reflect.Value{reflect.ValueOf(ctx)})&nbsp; &nbsp; &nbsp; &nbsp; handleMethod := middleware.MethodByName("Handle")&nbsp; &nbsp; &nbsp; &nbsp; values := handleMethod.Call([]reflect.Value{})&nbsp; &nbsp; &nbsp; &nbsp; if value, ok := values[0].Interface().(bool); !ok || !value {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; // fmt.Printf("%v\n", ctx)&nbsp; &nbsp; fmt.Fprint(rw, "Hello World.")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go