context在Go1.7之后就进入标准库中了。它主要的用处如果用一句话来说,是在于控制goroutine的生命周期。当一个计算任务被goroutine承接了之后,由于某种原因(超时,或者强制退出)我们希望中止这个goroutine的计算任务,那么就用得到这个Context了。 (推荐学习:go)

对于 Golang 开发者来说context(上下文)包一定不会陌生。但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它。

应用场景:在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。

请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和 RPC 服务。

用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。

当一个请求被取消或超时时,所有用来处理该请求的goroutine都应该迅速退出,然后系统才能释放这些goroutine占用的资源

Context 原理

Context 的调用应该是链式的,通过WithCancel,WithDeadline,WithTimeout或WithValue派生出新的 Context。当父 Context 被取消时,其派生的所有 Context 都将取消。

通过context.WithXXX都将返回新的 Context 和 CancelFunc。调用 CancelFunc 将取消子代,移除父代对子代的引用,并且停止所有定时器。未能调用 CancelFunc 将泄漏子代,直到父代被取消或定时器触发。go vet工具检查所有流程控制路径上使用 CancelFuncs。

遵循规则

遵循以下规则,以保持包之间的接口一致,并启用静态分析工具以检查上下文传播。

不要将 Contexts 放入结构体,相反context应该作为第一个参数传入,命名为ctx。 func DoSomething(ctx context.Context,arg Arg)error { // ... use ctx ... }

即使函数允许,也不要传入nil的 Context。如果不知道用哪种 Context,可以使用context.TODO()。

使用context的Value相关方法只应该用于在程序和接口中传递的和请求相关的元数据,不要用它来传递一些可选的参数

相同的 Context 可以传递给在不同的goroutine;Context 是并发安全的。

更多相关文章

  1. JavaScript中的执行上下文和堆栈[每日前端夜话(0x0C)]
  2. 调用没有当前上下文的OpenGL ES API(每个线程记录一次)
  3. 在javascript中识别/获取选定的上下文菜单项
  4. JavaScript - 检查是否在全局上下文中
  5. 有没有办法在javascript控制台中将上下文更改为iframe?
  6. 我可以更改javascript“this”的上下文吗?
  7. 套接字错误“IP地址在其上下文中无效” - Python
  8. Android开发之Android Context,上下文(Activity Context, Applica
  9. 点击或长按的Android Listview用户交互设计上下文菜单

随机推荐

  1. Android中文 API (31) —— TimePicker
  2. Android Touch事件分发机制
  3. Android(安卓)UI开源框架
  4. Realtek 8192cu 支持 Android Hotspot 软
  5. android studio ndk编译问题
  6. Android联系人数据库全解析(5)
  7. android layouts之RelativeLayout
  8. react-native APP图标和Splash(Android)
  9. 移植android的工作环境
  10. 2015-10-30-02-Android Theme主题使用心