背景

学一个东西之前应该先明白他到底是干什么的,如果这个东西没有适用的场景,那你看他的源码就是浪费时间。

四种context

  1. emptyCtx 实现了一个空的context,可以用作根节点
  2. cancelCtx 实现一个带cancel功能的context,可以主动取消
  3. timerCtx实现一个通过定时器timer和截止时间deadline定时取消的context
  4. valueCtx 实现一个可以通过 key、val两个字段来存数据的context

context能干什么?

  1. 传递上下文

比如一个请求过来后,调用了服务A,服务A又调用了服务B,B又调用了C…,那么想在这些服务中间共享一些信息,例如链路追踪的trace_id,可以使用 valueCtx ,这样服务A、B、C都可以通过 ctx.Value(“trace-id”) 获取。

  1. 控制协程关闭

还是一个请求过来,调用了服务A,服务A又调用了服务B,B又调用了C…,如果当请求调用到A、B、C还没有得到结果时就关闭了请求,那么再调用A、B、C就是没有任何意义的,那么就可以利用ctx, cancel := context.WithCancel(context.Background()),让服务A、B、C都
监听ctx.done(), 当在请求调用cancel()时,A、B、C服务看到请求取消了调用,就不在继续执行,省的浪费资源。

  1. 控制超时取消

我们后端的服务一般都会设置一个超时时间,比如A服务调用B服务,如果A调用B 5秒后没有得到响应,就重新发起请求,就可以用到ctx, _ := context.WithTimeout(context.Background(), 5000*time.Millisecond)。当然了你说我自己实现一个定时器不就完了么?但是你要考虑 如果有条件换成了 A调用B,B又调用C这种情况,用上下文的优势就出来了,可以在A调用B超过5秒后也关闭B对C的调用防止资源浪费,当然了这个层级越深优势越大。

原理

当然你可以去看源码,我只是说核心的实现。

type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key interface{}) interface{}
}

关键的还是这个Done()方法
Done():返回一个只读chan,如果可以从该 chan 中读取到数据,则说明 ctx 被取消了

如果我们自己想实现一个取消是这么写。

 done := make(chan struct{})go func() {for {select {case <-done:fmt.Println("cancel")time.Sleep(1000*time.Millisecond)default:fmt.Println("not cancel")time.Sleep(1000*time.Millisecond)}}}()fmt.Println("working")time.Sleep(1000*time.Millisecond)fmt.Println("working")time.Sleep(1000*time.Millisecond)close(done)

其实context和我们自己写的也差不多,只是他有一个层级的关系,就是前面写到的A调用B、B又调用C,所以层级就是A是B的parent,B是C的parent,当A进行取消的时候也会将B、C取消,说白了就是当A调用close(done)时候,B、C也会调用close(done),只是这个复杂的层级关系context这个包帮你做了,cancelCtx 、timerCtx本质区别就是多了一个定时器,一个是你自己取消,一个是到期了自动帮你取消,valueCtx就是让服务A、B、C(无论多深)都可以获取到某个key=>value对,实现思路也简单,就是一层一层向上的找,比如从服务C执行ctx.Value(“trace-id”) 没有话就去parent B找,B没找到就去A找,A也没找到就是没有了。

总结

知道了应用场景。知道了核心原理,用起来也就没那么难了。

参考

https://zhuanlan.zhihu.com/p/420127690

大白话之golang context相关推荐

  1. Golang Context 详细原理和使用技巧

    文章目录 Golang Context 详细原理和使用技巧 Context 背景 和 适用场景 Context 的背景 Context 的功能和目的 Context 的基本使用 Context 的同步 ...

  2. Golang context.Context

    这里填写标题 1. Golang context.Context 1.1. 内容前导 1.2. 基础知识 1.2.1. Context 接口 1.2.2. 顶层 Context 1.2.3. 子 Co ...

  3. golang context 父子任务同步取消信号 协程调度 简介

    目录 前言 为什么需要context context是什么 context的使用 总结 前言 这篇文章将介绍Golang并发编程中常用到一种编程模式:context.本文将从为什么需要context出 ...

  4. Golang Context包的使用

    context包主要用来控制goroutings间的并发控制.使用场景包括通知子协程退出这种. 相关接口和示例: func Background() Context Background return ...

  5. golang context包

    一.介绍 go中有Context 包,专门用来简化 对于处理单个请求的多个 goroutine 之间与请求域的数据.取消信号.截止时间等相关操作,这些操作可能涉及多个 API 调用.你可以通过 go ...

  6. golang - context包使用示例 以及 底层实现

    文章目录 1. context 常用方法,以及各种适用于什么场景 1.1 context含有的方法 1.2 方法适用场景和伪代码示例 1.2.1 值传递:比如gin框架中用来传递key,value的值 ...

  7. golang context的done和cancel的理解 for循环channel实现context.Done()阻塞输出

    以下纯做练习. 方便context的done和cancel的理解.done()是监听cancel或超时操作. func main() {type Output struct {Num int}ms : ...

  8. Golang中context实现原理剖析

    转载: Go 并发控制context实现原理剖析 1. 前言 Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生gorou ...

  9. 此上下文中不允许函数定义。_深度好文 | 你知道Go中的 context 是怎么实现的吗?...

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 语言的 context 包短小精悍,非常适合新手学习.不论是它的源码还是实际使用,都值得投入时间去学习. 这篇文章依然想 ...

最新文章

  1. Linux 内核,30 年C 语言将升级至 C11
  2. 常见排序算法:希尔排序
  3. extjs chart无法在panel中显示_手绘风格的 JS 图表库:Chart.xkcd
  4. 消息队列之JMS和AMQP对比
  5. boost::locale::generator用法的测试程序
  6. 为什么我会在2012年的新企业Java项目中使用Java EE而不是Spring
  7. 如何快速取消svn的关联
  8. This ZooKeeper instance is not currently serving requests
  9. jsoneditor光标错位的原因及解决方式
  10. Tinder + 抖音 = ?新生代约会 App 来了,年轻人在刷刷刷中坠入爱河
  11. 【教程】如何批量获取图片信息,尺寸、大小、路径、文件名,然后导出表格或者txt的文本,下面教你使用方法
  12. 电脑定时关机、取消定时关机、滑动关机
  13. 【程序源代码】微信小程序商城,微信小程序微店
  14. MySQL查询和删除重复记录
  15. ESP8266 Arduino-FLASH按钮电平驱动LED灯翻转
  16. 为什么Android手机APP闪退,安卓手机软件闪退怎么办 安卓软件停止运行解决方法_系统圣地...
  17. 大数据——频繁关联规则,置信度,支持度
  18. 网站上的QQ在线客服“QQ在线状态”按钮变成灰色“未启用”状态?
  19. c语言adc采集取平均值,单片机ADC采样算法----递推平均值采样法
  20. 论如何做好一个大型数据项目:软实力和硬实力

热门文章

  1. 2021年洛阳高中高考成绩查询,权威数据!2019年洛阳高考一本上线率、清北人数公布!还有一批学校被......
  2. 【74期】面试官:对多线程熟悉吗,来谈谈线程池的好处?
  3. 欧陆战争5设备系统时间与服务器时间不一致,欧陆战争5怎么领每日任务 每日任务数量与质量攻略...
  4. HTML5动漫网页设计——少女漫画心(HTML+CSS+JavaScript+Bootstrap)
  5. 有缺陷的人能不能成功?
  6. 618前夕,淘宝天猫大变革,探索电商天花板之上的价值
  7. 请收下!春节聚会装B指南!附研习社工作汇报(2020)
  8. 企业数据管理中,数据可视化的重要性
  9. 局部解剖 作业及答案
  10. 完爆面试官!kafka重启后同步时间太长