context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。
一句话:context 用来解决 goroutine 之间退出通知、元数据传递的功能。
context常用的使用姿势:
1、并发控制: web编程中,一个请求对应多个goroutine之间的数据交互
2、超时控制 : mongo-driver中很多方法第一个参数就是context ,需要设置context的timeout
3.上下文控制 :
context 底层实现原理
整体概览
context 包的代码并不长,context.go 文件总共不到 500 行,其中还有很多大段的注释,代码可能也就 200 行左右的样子,是一个非常值得研究的代码库。
[中间大篇幅讲解源码 请看知乎:] https://zhuanlan.zhihu.com/p/68792989
总结
到这里,整个 context 包的内容就全部讲完了。源码非常短,很适合学习,一定要去读一下。
context 包是 Go 1.7 引入的标准库,主要用于在 goroutine 之间传递取消信号、超时时间、截止时间以及一些共享的值等。它并不是太完美,但几乎成了并发控制和超时控制的标准做法。
使用上,先创建一个根节点的 context,之后根据库提供的四个函数创建相应功能的子节点 context。由于它是并发安全的,所以可以放心地传递。
当使用 context 作为函数参数时,直接把它放在第一个参数的位置,并且命名为 ctx。另外,不要把 context 嵌套在自定义的类型里。
最后,大家下次在看到代码里有用到 context 的,观察下是怎么使用的,肯定逃不出我们讲的几种类型。熟悉之后会发现:context 可能并不完美,但它确实简洁高效地解决了问题。