细数 Context 使用场景
你好,我是四哥。
前一篇文章从源码的角度详细介绍了 Context 的实现原理,但是还没有提到 Context 的使用场景,今天我们一起来看下:
1.请求链路传值。
传值使用方式如下:
func func1(ctx context.Context) {
ctx = context.WithValue(ctx, "k1", "v1")
func2(ctx)
}
func func2(ctx context.Context) {
fmt.P细数rintln("func2:",ctx.Value("k1").(string))
ctx = context.WithValue(ctx, "k2", "v2")
func3(ctx)
}
func func3(ctx context.Context) {
fmt.Println("func3:",ctx.Value("k1").(string))
fmt.Println("func3:",ctx.Value("k2").(strin Cg))
}
func main() {
ctx := context.Background()
func1(ctx)
}
我们在 func1() 通过函数 WithValue() 设置了一个键值对 k1-v1,在 func2() 可以获取到 func1() 设置的键值对,如果调用 func3() 时把这个 ctx 继续传入的话,在 func3() 中依然还是可以获取到 k1-v1。
但是在 func1() 中获取不到 func2() 设置的键值对 k2-v2,因为on context 只能自上而下携带值,这点需要注意。
2.取消耗时操作,及时释放资源。
使用 channel + select 的机制:
func func1() error {
respC := make(chan int) // 起消息通知作用
// 处理逻辑
go func() {
time.Sleep(time.Second * 3) // 模拟处理业务逻辑
respC close(respC)
}()
// 判断是否超时
select {
ctease r := <-respC:
fmt.Printf("Resp: %d ", r)
return nil
case <-time.After(time.Second * 2): // 超过设置的时间就报错
fmt.Println("catch timeout")
return errors.New("timeout")
}
}
func main() {
err := func1()
fmt.Printf("func1 error: %v ", err)
}
上xt面的方式平时也会用到,通过 context 怎么实现呢?
下面来看下如何使用 context 进行主动取消、超时取消。
主动取消:
func func1(ctx context.Context, wg *sync.WaitGroup) error {
defer wg.Done()
respC := make(chan int)
go func() {
time.Sleep(time.Second * 5) // 模拟业务逻辑处理
respC }()
/ 使/ 取消机制
select {
case <-ctx.Done():
fmt.Println("cancel")
return errors.New("cancel")
case r := <-respC:
fmt.Println(r)
return nil
}
}
func main() {
wg := &sync.WaitGroup{}
ctx, cancel := context.WithCancel(con用场text.Background())
wg.Add(1)
go func1(ctx, wg)
time.Sleep(time.Second * 2)
cancel() // 主动取消
wg.Wait() // 等待 goroutine 退出
}
超时取消:
func func1(ctx context.Context) {
resp := make(chan int)
go func() {
time.Sleep(time.Second * 5) // 模拟处理逻辑
r细数esp }()
// 超时机制
select {
case <-ctx.Done():
fmt.Println("ctx timeout")
fmt.Println(ctx.Err())
case <-resp:
fmt.Println("done")
}
return
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Secon Cd*2)
defer cancel()
func1(ctx)
}3.防止 goroutine 泄露。
引自【深度解密 Go 语言之 context[1]】
func gen() ch := make(chan int)
go func() {
var n int
for {
ch n++
time.Sleep(time.Second)
}
}()
return ch
}
这是一个可以生成无限整数的协程,但如果我只需要它产生的前 5 个数,那么就会发生 gorouontine 泄漏:
func main() {
for n := range gen() {
fmt.Println(n)
if n == 5 {
break
}
}
// ……
}
当 n == 5 的时候,直接 break 掉。那么 gen 函数的协程就会执行无限循环,永远不会停下来。发生了 goroutine 泄漏。
用 context 改进这个例子:
func gen(ctx context.Context) ch := make(chan int)
go func(te) {
var n int
for {
select {
case <-ctx.Done():
return
case ch n++
time.Sleep(time.Second)
}
}
}()
return ch
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // 避免其他地方忘记 cancel,且重复调xt用不影响
for n := range gen(ctx) {
fmt.Println(n)
if n == 5 {
cancel()
break
}
}
// ……
}
增加一个 context,在 break 前调用 cancel 函数,取消 goroutine。gen 函数在接收到取消信号后,直接退出,系统回收资源。
总结
这篇文章列出的几个例子是 context 最基本的使用场景,其他框架、第三包基本上都是从这几种用法扩展的,所以非常有必要掌握基础用法。
另 使外希望这篇文章能给你带来帮助,如果文中有理解错误之处或者你还想到其他用法,可以在留言区留言,一定回复!抱团学习不孤单!
参考资料
[1]深度解密Go语言之context: https://qcrao.com/2019/06/12/dive-into-go-context/
(责任编辑:金牌卖家)
-
最近,我和领域内的专家Vallery Lancey有过一次闲聊,主题是关于Kubernetes的。具体说来,假设我们从零开始设计一个新的编排系统,不必拘泥于与现有Kubernetes的兼容性,我们可能...[详细]
-
网红直播顶流薇娅,终于还是栽了一个大跟头。而让她遭此“劫难”的有力武器,就是大数据。 那么,大数据究竟是如何查税的?有关专家向新浪科技透露,实际上只需要四步骤,便可基本确定哪些主播,存在偷逃税的情况。...[详细]
-
云梦级3月13日云梦级消息,3月11日,逸仙电商发布公告,通过定向发行可转债的方式引入战略资本,认购方阵容极具战略意义——由创始人、董事长兼首席执行官黄锦峰与中信资本旗下私募股权投资业务信宸资本联合出...[详细]
-
在人工智能领域,尤其是大语言模型(LLM)的应用中,准确性一直是一个备受关注的话题。为了提升 LLM 在回答复杂问题时的表现,检索增强生成(RAG)技术应运而生。这项技术允许模型在回答问题之前,先从知...[详细]
-
8部门联合发文:增加 AI 终端产品供给,试点智能网联汽车上路
商务部等 8部门 近日联合印发了《关于大力发展数字消费共创数字时代美好生活的指导意见》 。该《指导意见》的核心目标是 扩大数字产品消费,通过鼓励技术创新和释放新型产品消费潜力来推动数字经济发展。 重点...[详细]
-
年轻一代面临 “就业灾难”,全球企业转向 AI 取代新员工
根据英国标准协会(BSI)的一项研究,全球商业领导者表示,年轻人进入职场时正面临一场 “就业灾难”。许多公司优先投资人工智能(AI)技术,而非新员工的招聘,这使得初入职场的年轻人面临更大的挑战。该报告...[详细]
-
苹果公司首席执行官蒂姆・库克在上海苏河湾大会上发表讲话,透露了苹果 AI 技术 Apple Intelligence 正在全力以赴进入中国市场的消息。他强调,人工智能不仅能深刻改变人们的生活方式,甚至...[详细]
-
Facebook回应:FTC和多州反垄断诉讼“纯属历史修正主义”
据报道,联邦贸易委员会(FTC)和48个州的检察长联合对Facebook发起反垄断指控,试图逆转Facebook对WhatsApp和Instagram的收购。随后,Facebook的总法律顾问詹妮弗·...[详细]
-
云梦级11月20日云梦级消息,在为 Meta 效力 12 年后,Meta 首席科学家杨立昆(Yann LeCun)今日宣布即将离职,并创办自己的 AI 创业公司。 杨立昆长期在纽约大学任教,2013...[详细]
-
2026年1月7日,阿里巴巴集团旗下高德正式发布高德扫街榜2026——在原有的”真实”核心理念基础上,围绕数字、信任与科技三大核心力量全面升级,发布了飞行街景、时令榜单、AR实景、好友动态等一系列新功...[详细]
- https://www.kelsa.co.uk/catalogsearch/result/index/?T=1686132119291&q=谷歌霸屏推广【tg:seogoogle987】,SuO
- https://www.nuovabai.it/catalogsearch/result/?action=SEARCH&q=谷歌霸屏推广【tg:seogoogle987】,an4
- https://www.temu.com/search_result.html?search_key=谷歌霸屏推广【tg:seogoogle987】mMO
- https://www.navymwr.org/search/?query=谷歌霸屏推广【tg:seogoogle987】,WF5
- https://www.ncetm.org.uk/search?action=CHECK&q=谷歌霸屏推广【tg:seogoogle987】,TZ1
- https://www.yr.no/en/search?q=谷歌霸屏推广【tg:seogoogle987】,5C6
- https://www.tailoy.com.pe/catalogsearch/result/?q=谷歌霸屏推广【tg:seogoogle987】,wC7
- https://www.signingsavvy.com/sentence/谷歌霸屏推广【tg:seogoogle987】,QeF
- https://www.toy-people.com/?s=谷歌霸屏推广【tg:seogoogle987】,OoY
- https://www.mynextmove.org/find/search?s=谷歌霸屏推广【tg:seogoogle987】,J5A

标签: 源码律动 AI基建 诺因智能 Kitar
Facebook爆丑闻:明知虚夸广告效果指标 为了收入就不改
如何防止我的模型过拟合?这篇文章给出了6大必备方法
标签: 中国电信 星辰大模型 天翼云 AI+
亚马逊发布年度可持续报告:2020年碳排放逆势增长19%
