上下文"/>
golang context上下文
文章目录
- 一、为什么需要context
- 二、context 接口
- 三、Background 方法
- 四、 with 系列函数
- 1、WithCancel 方法
- 2、WithDeadline 方法
- 3、WithTimeout 方法
- 4、WithValue 方法
- 五、使用注意事项
一、为什么需要context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。
用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。
二、context 接口
context.Context
是一个接口,该接口定义了四个需要实现的方法。
语法:
type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key interface{}) interface{}
}方法解释:Deadline():返回当前Context被取消的时间,也就是完成工作的截止时间(deadline);Done():返回一个Channel,这个Channel会在当前工作完成或者上下文被取消之后关闭,多次调用Done方法会返回同一个Channel;Err():返回当前Context结束的原因,它只会在Done返回的Channel被关闭时才会返回非空的值;如果当前Context被取消就会返回Canceled错误;如果当前Context超时就会返回DeadlineExceeded错误;Value():从Context中返回键对应的值,对于同一个上下文来说,多次调用Value 并传入相同的Key会返回相同的结果;
三、Background 方法
语法:
context.Background() Context
分析: Background()主要用于main函数、初始化以及测试代码中,作为Context这个树结构的最顶层
的Context,也就是根Context。
四、 with 系列函数
1、WithCancel 方法
WithCancel返回带有新Done通道的父节点的副本。当调用返回的cancel函数或当关闭父上下文的Done通道时,将关闭返回的上下文的Done通道。
语法:
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
2、WithDeadline 方法
返回父上下文的副本,并将deadline
调整为不迟于d。如果父上下文的deadline已经早于d,则WithDeadline(parent, d)在语义上等同于父上下文。当截止日过期时或调用返回的cancel函数时或当父上下文的Done通道关闭时,返回上下文的Done通道将被关闭,以最先发生的情况为准。
语法:
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
3、WithTimeout 方法
WithTimeout返回WithDeadline(parent, time.Now().Add(timeout))
。
语法:
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
4、WithValue 方法
WithValue函数能够将请求作用域的数据与 Context 对象建立关系。WithValue返回父节点的副本,其中与key关联的值为val。
语法:
func WithValue(parent Context, key, val interface{}) Context
五、使用注意事项
- 推荐以参数的方式显示传递Context
- 以Context作为参数的函数方法,应该把Context作为第一个参数。
- 给一个函数方法传递Context的时候,不要传递nil,如果不知道传递什么,就使用
context.Background()
- Context的Value相关方法应该传递请求域的必要数据,不应该用于传递可选参数
- Context是
线程安全
的,可以放心的在多个goroutine中传递
更多推荐
golang context上下文
发布评论