Golang Go语言中 context 的相关使用
Golang Go语言中 context 的相关使用
如题,之前的项目中没有使用 context,高并发的场景下,日志都难以定位问题,于是准备在所有逻辑函数中加上 context (工作量有点大),并为每次请求带上 id 标识;
但是除此之外就没有其他作用了,就有点怀疑是否有必要;
有没有大佬介绍下实际中的其他使用场景和方式?( With 系列目前也没有发现有什么使用场景...)
一般可以用来作为网络 io 调用的超时功能,你的需求可能需要在 log 打印中携带一些上下文信息,不一定要用 context
更多关于Golang Go语言中 context 的相关使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
现在是没有使用到 context 的,有没有必要在逻辑函数里加上 context 参数往后传递,方便后续扩展使用
没人使用 context 做 traceid 的事情,context 主要用途是控制子 goroutine 的存活,你的需求可以采用 WithOption 的方式
http 的封装下就好,rpc 有全链路日志就是 context 传递
我们用了…
我们也用了…
我们还是用了…
为了明确数据类型,我们不使用 context
那有没有必要全部加上 context 字段往下传递,作为后续预留使用?
我们也用了。。。
加 context 这个工作量还好吧,前不久刚加过,用 goland 重构功能一下就加好了。。。
我们也用了 context 传 traceid
主要是项目是新写的, 日志和方法第一个参数都是 ctx
好处就是 性能好很多, 弊端就是有点蠢…
如果老项目,可以用代码无侵入的方法,不过性能有点问题…
233 ,我们都在用
trace id 通过 context 传递,这简直是基本操作阿
context 写定时任务,withCancel 在 gracefully shutdown 的时候很好用,监听 <-ctx.Done() 或者 <-ticker.C (继续),再用一个 channel 监听定时任务完成的消息,外层调用 cancel 等待 channel 返回数据就好
with 时间的就不多说了
而且没必要在所有函数加上 Context,几个关键入口就知道谁有问题了吧
At Google, we require that Go programmers pass a Context parameter as the first argument to every function on the call path between incoming and outgoing requests.
建议是所有的函数的第一个都带上。
作用有几个:
cancel, timeout, trace
涨姿势了……
我以为在所有地方传递 ctx 很傻叉……
看到大家都这样我就放心了:)
#3 用了 + 1 用 context 传递 traceId 是主流操作……
我们也是 context 传 traceId 哈哈
管他三七二十一,接口设计的时候就加上,用不用再说,说不定什么时候就用上了呢?😄
trace,管理 go routine (控制超时什么的)
应该主要就这两个用了,其实就是个上下文环境了
哈哈 tornado 单线程我们使用 contextvar
Flask 使用 threadlocal
Go 随时起 性能好 不过 ctx 用起来麻烦了点
我们也用了。context 非常适合。
额,我好像是这么用的,这里有什么设计问题吗?
cxt 的设计其实非常简单粗暴…这也是不如 java 的地方,很多时候没法对代码无侵入。
我们也是 context 传 tracerid,接入 http server/client,实现多服务全链路串联;另外 context 里带上 stack,实现模块调用堆栈打点
我们也用了,不太理解不用 ctx 要怎么做链路的追踪
主要用来传参
+1
大佬,堆栈打点具体是怎么做的啊
个人认为 go 的话显式比隐式好…
侵入性太强了,以前的 code base 大的话根本改不动
就是 context.WithValue 带个自定义的调用栈信息,先进先出,实现调用函数链的追踪
我是觉得业务代码就别提什么侵入性了。
在Go语言中,context
包提供了一种在不同Goroutine之间传递截止日期、取消信号以及其他请求范围内数据的方法。context
的主要用途包括控制超时、优雅地取消长时间运行的操作,以及在请求范围内传递认证信息或追踪信息。
context
包定义了四种类型:Context
、CancelFunc
、Deadline
和TimeoutError
。其中,Context
是一个接口,它包含了四种方法:Deadline
、Done
、Err
和Value
。
Deadline
返回一个表示上下文何时应该结束的截止日期和一个布尔值,指示是否设置了截止日期。Done
返回一个关闭的通道,当上下文被取消或超时时,该通道会被关闭。Err
在上下文被取消或超时时返回一个错误。Value
从上下文中获取与键相关联的值。
context
包还提供了几个函数来创建和派生上下文:
context.Background
返回一个空的上下文,通常用作顶级上下文。context.TODO
返回一个空的上下文,当不清楚应该使用什么上下文时使用。context.WithCancel
、context.WithTimeout
和context.WithDeadline
分别用于创建可以取消、具有超时和具有截止日期的上下文。
使用context
时,重要的是要确保在不再需要时取消它,以避免资源泄漏。此外,上下文应该仅用于传递请求范围内的数据,而不应作为跨API或包的通用数据传递机制。