Golang context 实现原理与源码分析

2023年 8月 13日 29.4k 0

0 context入门介绍

context是Golang应用开发常用的并发控制技术,主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。

context实际上只定义了接口,凡是实现该接口的类都可称为是一种context,官方包中实现了几个常用的context,分别可用于不同的场景;

  • cancelCtx实现了Context接口,通过WithCancel()WithCancelCause()创建cancelCtx实例;
  • timerCtx实现了Context接口,通过WithDeadline()WithTimeout()创建timerCtx实例;
  • valueCtx实现了Context接口,通过WithValue()创建valueCtx实例;

context译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。以上三种context实例可互为父节点,父goroutine派生出子goroutine,而子goroutine又继续派生新的goroutine,即多级goroutine。
在Go 里,我们不能直接杀死协程,协程的关闭一般会用 channel+select 方式来控制。但是在多级goroutine的情况下,例如处理一个请求衍生了很多协程,这些协程之间是相互关联的:需要共享一些全局变量、有共同的 deadline 等,而且可以同时被关闭。再用 channel+select 就会比较麻烦,这时就可以通过 context 来实现。
在这里插入图片描述

1. Context接口

1.1 context.Context接口定义

type Context interface {
Deadline() (deadline time.Time, ok bool)//返回 context 的过期时间;
Done()

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论