在Golang使用过程中经常需要跟协程(goroutine)打交道,在Golang中可以很方便的创建协程,只需要在函数调用前面添加一个go
关键字。但是golang本身并没有提供对协程本身进行控制的手段。比如需要在协程的创建者结束时同时结束其创建的协程。
context
包在Golang 1.7时加入到标准库中。其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据。其具体作用为:
- 可以通过
context
发送取消信号。 - 可以指定截止时间(Deadline),
context
在截止时间到期后自动发送取消信号。 - 可以通过
context
传输一些数据。
context
在Golang中最主要的用途是控制协程任务的取消,但是context
除了协程以外也可以用在线程控制等非协程的情况。
基本概念
context
的核心是其定义的Context
接口类型。围绕着Context
接口类型存在两种角色:
- 父任务:创建
Context
,将Context
对象传递给子任务,并且根据需要发送取消信号来结束子任务。 - 子任务:使用
Context
类型对象,当收到父任务发来的取消信号,结束当前任务并退出。
接下来我们从这两个角色的视角分别看一下Context
对象。
…