Context

http://golang.iswbm.com/en/latest/c04/c04_09.html



  1. 什么是 Context?
    在 Go 1.7 版本之前,context 还是非编制的,它存在于 golang.org/x/net/context 包中。



后来,Golang 团队发现 context 还挺好用的,就把 context 收编了,在 Go 1.7 版本正式纳入了标准库。



Context,也叫上下文,它的接口定义如下



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

可以看到 Context 接口共有 4 个方法



Deadline:返回的第一个值是 截止时间,到了这个时间点,Context 会自动触发 Cancel 动作。返回的第二个值是 一个布尔值,true 表示设置了截止时间,false 表示没有设置截止时间,如果没有设置截止时间,就要手动调用 cancel 函数取消 Context。



Done:返回一个只读的通道(只有在被cancel后才会返回),类型为 struct{}。当这个通道可读时,意味着parent context已经发起了取消请求,根据这个信号,开发者就可以做一些清理动作,退出goroutine。



Err:返回 context 被 cancel 的原因。



Value:返回被绑定到 Context 的值,是一个键值对,所以要通过一个Key才可以获取对应的值,这个值一般是线程安全的。




  1. 为何需要 Context?
    当一个协程(goroutine)开启后,我们是无法强制关闭它的。



常见的关闭协程的原因有如下几种:



goroutine 自己跑完结束退出



主进程crash退出,goroutine 被迫退出



通过通道发送信号,引导协程的关闭。



第一种,属于正常关闭,不在今天讨论范围之内。



第二种,属于异常关闭,应当优化代码。



第三种,才是开发者可以手动控制协程的方法



http://golang.iswbm.com/en/latest/c04/c04_09.html



https://www.cnblogs.com/chenqionghe/p/13067596.html


Category golang