细数Context使用场景

2022-02-22 12:57:08 来源: TechWeb 阅读量:7046   

你好,我是四哥。

细数Context使用场景

前一篇文章从源码的角度详细介绍了 Context 的实现原理,但是还没有提到 Context 的使用场景,今天我们一起来看下:

1.请求链路传值。

传值使用方式如下:

func func1 ctx = context.WithValue func2func func2 fmt.Println.) ctx = context.WithValue(ctx, "k2", "v2") func3func func3 fmt.Println("func3:",ctx.Value("k1").) fmt.Println("func3:",ctx.Value("k2").)func main() ctx := context.Background() func1

我们在 func1 通过函数 WithValue 设置了一个键值对 k1—v1,在 func2 可以获取到 func1 设置的键值对,如果调用 func3 时把这个 ctx 继续传入的话,在 func3 中依然还是可以获取到 k1—v1。

但是在 func1 中获取不到 func2 设置的键值对 k2—v2,因为 context 只能自上而下携带值,这点需要注意。。

2.取消耗时操作,及时释放资源。

使用 channel + select 的机制:

func func1 error respC := make(chan int) // 起消息通知作用 // 处理逻辑 go func time.Sleep(time.Second * 3) // 模拟处理业务逻辑 respC close(respC) // 判断是否超时 select case r := lt,—respC: fmt.Printf("Resp: %d ", r) return nil case lt,—time.After(time.Second * 2): // 超过设置的时间就报错 fmt.Println("catch timeout") return errors.New("timeout") func main err := func1 fmt.Printf("func1 error: %v ", err)

上面的方式平时也会用到,通过 context 怎么实现呢。

下面来看下如何使用 context 进行主动取消,超时取消。

主动取消:

func func1 error defer wg.Done() respC := make(chan int) go func() time.Sleep(time.Second * 5) // 模拟业务逻辑处理 respC () // 取消机制 select case lt,—ctx.Done(): fmt.Println("cancel") return errors.New("cancel") case r := lt,—respC: fmt.Println(r) return nil func main() wg := amp,sync.WaitGroup ctx, cancel := context.WithCancel(context.Background()) wg.Add(1) go func1(ctx, wg) time.Sleep(time.Second * 2) cancel() // 主动取消 wg.Wait() // 等待 goroutine 退出

超时取消:

func func1 resp := make(chan int) go func() time.Sleep(time.Second * 5) // 模拟处理逻辑 resp () // 超时机制 select case lt,—ctx.Done(): fmt.Println("ctx timeout") fmt.Println(ctx.Err()) case lt,—resp: fmt.Println("done") returnfunc main() ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) defer cancel() func13.防止 goroutine 泄露。iOS中的“快捷方式”应用程序现在可以在Mac上使用,而“焦点”通过减少干扰来帮助人们保持工作。

引自)

func gen ch := make(chan int) go func var n int for ch n++ time.Sleep(time.Second) return ch

这是一个可以生成无限整数的协程,但如果我只需要它产生的前 5 个数,那么就会发生 goroutine 泄漏:

func main for n := range gen fmt.Println(n) if n 5 break // hellip,hellip,

当 n 5 的时候,直接 break 掉那么 gen 函数的协程就会执行无限循环,永远不会停下来发生了 goroutine 泄漏

用 context 改进这个例子:

func gen ch := make(chan int) go func() var n int for select case lt,—ctx.Done(): return case ch n++ time.Sleep(time.Second) () return chfunc main() ctx, cancel := context.WithCancel(context.Background()) defer cancel() // 避免其他地方忘记 cancel,且重复调用不影响 for n := range gen fmt.Println(n) if n 5 cancel() break // hellip,hellip,

增加一个 context,在 break 前调用 cancel 函数,取消 goroutinegen 函数在接收到取消信号后,直接退出,系统回收资源

总结

这篇文章列出的几个例子是 context 最基本的使用场景,其他框架,第三包基本上都是从这几种用法扩展的,所以非常有必要掌握基础用法。Mac现在可以检测照片中的文字,或者在图像中提供动物,艺术,地标和植物的细节。

另外希望这篇文章能给你带来帮助,如果文中有理解错误之处或者你还想到其他用法,可以在留言区留言,一定回复!抱团学习不孤单!

参考资料

声明:本网转发此文章,旨在为读者提供更多信息资讯,所涉内容不构成投资、消费建议。文章事实如有疑问,请与有关方核实,文章观点非本网观点,仅供读者参考。

精选 导读

大摩:苹果产量或超预期增长,预计Q1业绩有“惊喜”

摩根士丹利分析师KatyHuberty指出,苹果本季度iPhone产量可能超预期增长,因为交货周期正在下降到“更正常的水平”。该分析师预计苹...

发布时间: 2021-12-23 17:04
行情   2021-12-23

中金:维持石四药集团跑赢行业评级目标价5.8港元

中金发布研究报告称,维持石四药集团“跑赢行业”评级,保持2021/22年归母净利润预测7.9/11.64亿元不变,目标价5.8港元。报告中称...

发布时间: 2021-12-23 17:03
行情   2021-12-23

实探中装建设元宇宙合作方鸿蒙时代:与华为无关已搬离注册地

12月22日,深交所对中装建设发布关注函,要求说明公司是否存在“楼宇智能大数据信息处理、AI可视化、元宇宙应用、智能建造系统、区块链等技术”...

发布时间: 2021-12-23 17:02
行情   2021-12-23

“疫”线女将:眼里有光心中有爱

“疫”线女将:眼里有光心中有爱题:“疫”线女将:眼里有光心中有爱曾灯光璀璨、游人如织的边陲小城因新冠疫情的再次暴发按下“暂停键”。内蒙古自治...

发布时间: 2021-12-23 16:48
要闻   2021-12-23

联通网络智能运维产品研发招标:华为、中软等11家企业入围

中国联通日前正式公布网络智能运维产品研发招标结果,华为、中软、软通动力、亚信科技等11家企业入围。传统网络故障的被动处理方式,从故障感知到信...

发布时间: 2021-12-23 16:35
酷玩   2021-12-23

热点 推荐

小米12Pro自研智能动态刷新率演示视频公布:支持新技能“滑动变速”,更

今日上午,小米手机官方表示,小米自研智能动态刷新率,是第二代低功耗2K屏幕的创新体验,第一次让小米12Pro拥有了滑动变速的新技能。小米表示...

发布时间: 2021-12-23 16:31
酷玩   2021-12-23

增速惊人!鸿蒙用户量半年突破2.2亿

C114讯12月23日下午消息在今日举办的华为动机旗舰新品发布会上,华为常务董事、消费者BGCEO、智能汽车解决方案BUCEO余承东公布了鸿...

发布时间: 2021-12-23 16:26
酷玩   2021-12-23

用户群聊从线上走到线下他趣成年轻群体社交困境破局者

伴随当下工作和生活节奏越来越紧凑,婚恋、交友等社交需求逐渐成为年轻人的刚性需求。为满足日益提升的社交需求,他趣用户从线上延伸到线下,通过组织...

发布时间: 2021-12-23 14:59
机器人   2021-12-23

京东会展云“云上服贸会”项目入选中国信通院“2021年数字孪生城市典型案

近日,2022中国信通院ICT+深度观察报告会隆重举办,京东会展云技术支持的中国国际服务贸易交易会数字平台项目入选“2021年数字孪生城市典...

发布时间: 2021-12-23 14:56
机器人   2021-12-23

华为Mate9手机推送鸿蒙HarmonyOS2.0.0.140:新增桌面

华为Mate9手机开始推送鸿蒙HarmonyOS2.0.0.140更新。更新包1优化了音量等基础体验,并新增了桌面图标放大功能。更新包2修复...

发布时间: 2021-12-23 14:41
机器人   2021-12-23
bd9