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

时间:2016-06-08 05:31:18

标签: go

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

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

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

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

1 个答案:

答案 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.")
}