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

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

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

Go
慕的地6264312 2022-01-17 16:38:29
我的代码有什么问题(IO 等待)?我设计了我的中间件,但在运行命令时遇到了错误(IO 等待):ab -c 100 -n 100000 -k  http://127.0.0.1:10000/完整代码如下: https ://github.com/HeadwindFly/examples/blob/master/middleware.go
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

第一:这里没有理由使用反射。与您的问题无关,但不需要。


在您的 Context 设置中,您使用的是 ctx 的全局变量。


go 的 http 服务器是并发的,所以你正在做的是让多个 goroutine 更新同一个全局变量,然后将它传递给处理程序。


这会导致您的处理程序有时会获得相同的 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.")

}


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信