Golang Go语言中 context 的相关使用

发布于 1周前 作者 h691938207 来自 Go语言

Golang Go语言中 context 的相关使用

如题,之前的项目中没有使用 context,高并发的场景下,日志都难以定位问题,于是准备在所有逻辑函数中加上 context (工作量有点大),并为每次请求带上 id 标识;

但是除此之外就没有其他作用了,就有点怀疑是否有必要;

有没有大佬介绍下实际中的其他使用场景和方式?( With 系列目前也没有发现有什么使用场景...)

35 回复

一般可以用来作为网络 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,无限传递

我们也用了 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包定义了四种类型:ContextCancelFuncDeadlineTimeoutError。其中,Context是一个接口,它包含了四种方法:DeadlineDoneErrValue

  • Deadline返回一个表示上下文何时应该结束的截止日期和一个布尔值,指示是否设置了截止日期。
  • Done返回一个关闭的通道,当上下文被取消或超时时,该通道会被关闭。
  • Err在上下文被取消或超时时返回一个错误。
  • Value从上下文中获取与键相关联的值。

context包还提供了几个函数来创建和派生上下文:

  • context.Background返回一个空的上下文,通常用作顶级上下文。
  • context.TODO返回一个空的上下文,当不清楚应该使用什么上下文时使用。
  • context.WithCancelcontext.WithTimeoutcontext.WithDeadline分别用于创建可以取消、具有超时和具有截止日期的上下文。

使用context时,重要的是要确保在不再需要时取消它,以避免资源泄漏。此外,上下文应该仅用于传递请求范围内的数据,而不应作为跨API或包的通用数据传递机制。

回到顶部