11 | Context:信息穿透上下文
该思维导图由 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-0721 - 江湖夜雨十年灯感觉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-062 - 那时刻请问老师,文中提到的 exported key 的静态类型和保守的 unexported 的类型,它们各自指的是什么类型呢?
作者回复: exported是go语言的说法,首字母大写,其它package可见。 “保守的.....”?
2020-11-052 - 楼梯口倒立这个例子讲的一言难尽,还不如百度出来的2021-09-17229
- 虫子樱桃Using Context Package in GO (Golang) – Complete Guide https://golangbyexample.com/using-context-in-golang-complete-guide/2020-11-04217
- PandaContext 就像 糖葫芦中的 竹签子2021-01-27110
- 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_Concurrency2020-11-04110
- 愤怒的显卡可以写几个应用的实例2020-11-1119
- 虫子樱桃context其实上几个例子更好。哈哈。大家可以参考 go by Example的例子 http://play.golang.org/p/0_bu1o8rIBO2020-11-049