Gin框架 gin.context使用注意事项

2024-04-18 20:19:00
CJL
原创
126

gin框架中 gin.Context是请求上下文。在使用协程时因为框架的实现逻辑有一些容易犯错的地方。常见的问题有:


1、数据竞争

2、context canceled

3、请求内数据错误


我们依次分析,

1、如果我们把gin.context传入到了协程内,这样不同的协程操作同一个ctx内的数据就会出现数据竞争,解决此类问题的方式时每个协程启动的时候使用gin.Context.Copy方法复制一个ctx传入。

2、gin.Context.Request.Context 是一个带cancel的ctx,当请求处理完后会变成完成状态。此时如果在协程中继续使用会取消执行的任务,比如查询数据库等,解决此类问题的方式是使用自定义的ctx包装一次或者去除request内的context.注意gin.Context.ContextWithFallback默认为false所以传递ginCtx的时候不会出现cancel的情况。ginCtxCopy后因为request是指针其context也不能使用。

3、在协程内通过gin.Context获取请求中的数据或上下文中的值,并发较高的情况下会出现取值错误,常见于traceId的获取。原因是gin框架会复用ctx,请求处理完后当前请求的ctx会分配给其他请求,内部数据也就变了,解决此类问题的方法是Copy一个ctx在协程中使用。


业务程序中我们一般可以自己封装一个ctx 将必要的数据放进去

发表评论
评论通过审核后显示。
流量统计