Go 并发编程实战课
晁岳攀(鸟窝)
前微博技术专家,知名微服务框架 rpcx 作者
25635 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 22 讲
Go 并发编程实战课
15
15
1.0x
00:00/00:00
登录|注册

11 | Context:信息穿透上下文

设置截止时间
生成带超时功能的Context
返回值中的cancel函数
用于主动取消长时间任务
传递上下文
生成新的Context
Value
Err
Done
Deadline
验证parent Context被cancel后,子conext是否也立刻被cancel了
Context并不会减少对服务器的请求负担
Context的最常用场景
WithDeadline
WithTimeout
WithCancel
WithValue
Context的约定俗成规则
Context接口方法
可取消的方法调用
超时控制的方法调用
控制子goroutine的运行
信息传递
Go1.9中解决新旧Context类型冲突问题
之前依赖golang.org/x/net/context库
Go1.7版本中正式加入标准库
上下文在开发场景中的不可或缺性
上下文的重要性
思考题
总结
创建特殊用途Context的方法
Context基本使用方法
Context的功能
Context的来历
信息穿透上下文
Context

该思维导图由 AI 生成,仅供参考

你好,我是鸟窝。
在这节课正式开始之前,我想先带你看一个工作中的场景。
假设有一天你进入办公室,突然同事们都围住你,然后大喊“小王小王你最帅”,此时你可能一头雾水,只能尴尬地笑笑。为啥呢?因为你缺少上下文的信息,不知道之前发生了什么。
但是,如果同事告诉你,由于你业绩突出,一天之内就把云服务化的主要架构写好了,因此被评为 9 月份的工作之星,总经理还特意给你发 1 万元的奖金,那么,你心里就很清楚了,原来同事恭喜你,是因为你的工作被表扬了,还获得了奖金。同事告诉你的这些前因后果,就是上下文信息,他把上下文传递给你,你接收后,就可以获取之前不了解的信息。
你看,上下文(Context)就是这么重要。在我们的开发场景中,上下文也是不可或缺的,缺少了它,我们就不能获取完整的程序信息。那到底啥是上下文呢?其实,这就是指,在 API 之间或者方法调用之间,所传递的除了业务参数之外的额外信息。
比如,服务端接收到客户端的 HTTP 请求之后,可以把客户端的 IP 地址和端口、客户端的身份信息、请求接收的时间、Trace ID 等信息放入到上下文中,这个上下文可以在后端的方法调用中传递,后端的业务方法除了利用正常的参数做一些业务处理(如订单处理)之外,还可以从上下文读取到消息请求的时间、Trace ID 等信息,把服务处理的时间推送到 Trace 服务中。Trace 服务可以把同一 Trace ID 的不同方法的调用顺序和调用时间展示成流程图,方便跟踪。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在开发中使用上下文(Context)的重要性和基本使用方法。上下文是指在API之间或方法调用之间传递的除业务参数外的额外信息,如客户端的IP地址、请求接收时间等。文章还介绍了Go标准库中Context的来历,以及其提供的方法和功能,包括Deadline、Done、Err和Value等。此外,还介绍了创建特殊用途Context的方法,如WithValue、WithCancel、WithTimeout和WithDeadline。总的来说,Context在处理http请求、控制子goroutine的运行、超时控制的方法调用以及可取消的方法调用等场景中具有重要作用。文章还提到了一些使用Context时的约定俗成的规则,以及一些争议和批评。尽管存在一些争议,但在很多场景下,使用Context会很方便,因此已经在Go生态圈中得到广泛应用。 文章还介绍了WithValue、WithCancel、WithTimeout和WithDeadline等方法的实现原理和使用场景。WithValue方法用于传递上下文信息,WithCancel用于主动取消长时间任务,WithTimeout和WithDeadline用于设置超时或截止时间。此外,还强调了正确使用这些方法的重要性,尤其是及时调用cancel函数释放资源。最后,通过示例代码展示了如何使用Context取消goroutine的运行以及对超时处理的思考。 总的来说,本文通过深入讲解Context的使用方法和原理,为开发者提供了全面的指导和思考。读者可以从中了解到Context在并发编程中的重要性,以及如何正确地使用和管理Context来提高程序的可靠性和性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 并发编程实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • syuan
    老师,您好。 var ( background = new(emptyCtx) todo = new(emptyCtx) ) 在实际使用中,这两个变量在什么时候执行,在引入包的时候就执行了吗? 还是在执行Background() ,TODO() 这两个函数调用的时候执行? 在一个main函数中多次调用Background() ,TODO(),background,todo变量始终是指向同一个值吗?

    作者回复: 引入的时候已经初始化了。同一个。

    2020-11-07
    2
    1
  • 江湖夜雨十年灯
    感觉context的例子太少了老师,实际中context用的场景其实最多对复杂

    作者回复: 后续有机会我再补充些例子

    2022-12-09归属地:北京
  • 老师好。 【记住,不是只有你想中途放弃,才去调用 cancel,只要你的任务正常完成了,就需要调用 cancel,这样,这个 Context 才能释放它的资源(通知它的 children 处理 cancel,从它的 parent 中把自己移除,甚至释放相关的 goroutine】 上面这一段中任务正常完成 parent来cancel不太理解,正常父主动cancel基本都属于中断操作。但是老师讲到要正常退出的时候来cancel一下,既然是正常结束,那么父应该知道子结束了才去cancel,那父子之间不是还要单独建立一个channel来进行通讯?没有get到老师的点,麻烦老师能不能举个例子

    作者回复: 这主要是context设计的问题,这个cancel你必须调用。即使子goroutine正常退出后,父goroutine也需要做一些额外的动作,如文中所示。这种情况不是'cancel'子goroutine,而是'free resources'. 所以这个cancel的叫法不准确,容易误导人,但go开发者也没想出更合适的名字

    2020-11-06
    2
  • 那时刻
    请问老师,文中提到的 exported key 的静态类型和保守的 unexported 的类型,它们各自指的是什么类型呢?

    作者回复: exported是go语言的说法,首字母大写,其它package可见。 “保守的.....”?

    2020-11-05
    2
  • 楼梯口倒立
    这个例子讲的一言难尽,还不如百度出来的
    2021-09-17
    2
    29
  • 虫子樱桃
    Using Context Package in GO (Golang) – Complete Guide https://golangbyexample.com/using-context-in-golang-complete-guide/
    2020-11-04
    2
    17
  • Panda
    Context 就像 糖葫芦中的 竹签子
    2021-01-27
    1
    10
  • Remember九离
    思考题简单写了下: ```go package main import ( "context" "fmt" "time" ) func main() { parent := context.Background() ctx, cancel := context.WithCancel(parent) child := context.WithValue(ctx, "name", "wuqq") go func() { for { select { case <-child.Done(): fmt.Println("it's over") return default: res := child.Value("name") fmt.Println("name:", res) time.Sleep(1 * time.Second) } } }() go func() { time.Sleep(3 * time.Second) cancel() }() time.Sleep(5 * time.Second) } ``` 源码在:https://github.com/wuqinqiang/Go_Concurrency
    2020-11-04
    1
    10
  • 愤怒的显卡
    可以写几个应用的实例
    2020-11-11
    1
    9
  • 虫子樱桃
    context其实上几个例子更好。哈哈。大家可以参考 go by Example的例子 http://play.golang.org/p/0_bu1o8rIBO
    2020-11-04
    9
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部