Go语言并发编程基础上下文概念详解
并发编程是现代软件开发中非常重要的一部分,而Go语言则是一门专为并发编程而设计的语言。上下文(Context)概念则是Go语言并发编程中非常重要的一个概念。本文将详细讲解Go语言并发编程基础上下文概念。
什么是上下文?
上下文,英文叫做context,是Go语言标准库中的一个包,位于"context"目录下。上下文主要用来帮助goroutine控制goroutine之间的关系,实现任务的取消、截止时间等功能。简单来说,上下文提供给goroutine一个上下文环境,用于描述goroutine本身,以及一组相关的任务的上下文信息。
具体来说,上下文包括以下信息:
- 截止时间
- 取消信号
- 其他与goroutine相关的基本信息
上下文的四个方法
Go语言上下文提供了四个方法,用来控制goroutine的运行状态:
type Context interface {
// Done方法返回一个只读的chan,返回值表示上下文被取消的原因
Done() <-chan struct{}
// Deadline方法返回一个时间值,表示上下文的截止时间
Deadline() (deadline time.Time, ok bool)
// Err方法返回一个错误类型,表示上下文被取消的原因
Err() error
// Value方法返回上下文关联的值请求
Value(key interface{}) interface{}
}
在使用上下文的过程中,通常会使用context.Background()和context.WithCancel(parent context.Context)等方法来创建上下文,下面就以一个例子来说明这两个方法的使用。
示例1:使用context.WithCancel取消上下文
func longTimeTask(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("task canceled!")
return
default:
fmt.Println("task running")
time.Sleep(1 * time.Second)
}
}
}
func main() {
// 创建一个带有取消功能的上下文
ctx, cancelFunc := context.WithCancel(context.Background())
// 开启一个长时间的任务,并传递上下文ctx
go longTimeTask(ctx)
// 模拟3秒钟后取消任务
time.Sleep(3 * time.Second)
cancelFunc()
// 等待goroutine执行完成
time.Sleep(1 * time.Second)
fmt.Println("main exit")
}
上面的代码中,我们首先使用context.Background()方法创建了一个空白的上下文,然后使用context.WithCancel(parent context.Context)方法创建了一个带有取消功能的子上下文ctx,并通过go语句开启一个长时间执行的任务longTimeTask,并将子上下文ctx作为参数传递给longTimeTask。
在main函数中,我们使用time.Sleep(3 * time.Second)模拟了3秒的任务执行时间,然后在使用cancelFunc()函数来取消该子上下文ctx,并等待一秒钟,确保goroutine一定执行完成之后,再输出”main exit”。
示例2:使用context.WithValue传递值请求
func longTimeTask(ctx context.Context) {
name := ctx.Value("name")
if name != nil {
fmt.Println("hello,", name)
}
for {
select {
case <-ctx.Done():
fmt.Println("task canceled!")
return
default:
fmt.Println("task running")
time.Sleep(1 * time.Second)
}
}
}
func main() {
// 创建一个带有值请求的上下文
ctx := context.WithValue(context.Background(), "name", "Tom")
// 开启一个长时间的任务,并传递上下文ctx
go longTimeTask(ctx)
// 等待goroutine执行完成
time.Sleep(5 * time.Second)
fmt.Println("main exit")
}
上面的代码中,我们使用context.WithValue(parent context.Context, key interface{}, val interface{})方法创建了一个带有值请求的上下文ctx,并通过go语句开启一个长时间执行的任务longTimeTask,并将上下文ctx作为参数传递给longTimeTask。
在longTimeTask函数中,我们先通过ctx.Value("name")来获取请求的值,并输出hello,name。然后再使用select语句结合ctx.Done()来等待任务取消信号,如果接收到了任务取消信号,则输出”task canceled!”,并结束该任务。
在main函数中,我们等待5秒钟,确保长时间执行的任务已经完成,再输出”main exit”。
通过上面两个示例,我们可以看出,上下文context是Go语言并发编程中非常重要的一个概念,也是实现并发编程任务控制的关键。在实际开发中,我们应该熟练掌握上下文context的基础操作方法,以及上下文context的实际应用场景,并合理使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言并发编程基础上下文概念详解 - Python技术站