面试题答案
一键面试Context取消机制工作原理
- 信号传递:在Go语言中,Context用于在多个goroutine之间传递取消信号。当一个Context被取消时,所有从它派生出来的子Context也会被取消,进而通知相关的goroutine停止工作。
- 控制资源:常用于控制资源(如网络请求、数据库连接等)的生命周期,避免资源泄露。当操作不再需要时,可以通过取消Context来快速释放资源。
主要结构体
- Context:
- 它是一个接口类型,定义了四个方法:
Deadline
、Done
、Err
和Value
。 - 所有具体的Context实现都要满足这个接口。
- 它是一个接口类型,定义了四个方法:
- cancelCtx:
- 它是实现取消功能的核心结构体,嵌套了
Context
接口。 - 包含一个
cancel
函数,用于取消自身及其子Context。 - 有一个
mu
字段用于互斥锁,保证并发安全。
- 它是实现取消功能的核心结构体,嵌套了
- timerCtx:
- 嵌入了
cancelCtx
结构体,用于实现带截止时间或超时的Context。 - 包含一个
timer
字段,是一个指向time.Timer
的指针,用于定时触发取消。
- 嵌入了
- emptyCtx:
- 是
Context
接口的空实现,用于表示根Context。 - 有两种类型:
background
和todo
,分别通过context.Background()
和context.TODO()
函数获取。
- 是
主要方法
- context.WithCancel(parent Context) (ctx Context, cancel CancelFunc):
- 创建一个可取消的Context,返回新的Context和取消函数
cancel
。 - 调用
cancel
函数会取消这个Context及其所有子Context。
- 创建一个可取消的Context,返回新的Context和取消函数
- context.WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc):
- 创建一个在指定截止时间自动取消的Context。
- 当截止时间到达,Context会自动取消。
- context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc):
- 创建一个在指定超时时间后自动取消的Context。
- 它是
WithDeadline
的便捷包装,根据当前时间加上超时时间计算截止时间。
- ctx.Done() <-chan struct{}:
- 返回一个只读通道。
- 当Context被取消或过期时,这个通道会被关闭,goroutine可以通过监听这个通道来得知Context的取消信号。
- ctx.Err() error:
- 返回Context被取消的原因。
- 如果Context还未取消,返回
nil
;如果是被取消,返回context.Canceled
;如果是超时,返回context.DeadlineExceeded
。