Go 标准库面试题, Go 语言中 context 如何被取消?
Go 标准库面试题, Go 语言中 context 如何被取消?
QA
Step 1
Q:: Go 语言中 context 如何被取消?
A:: 在 Go 语言中,context 包提供了一种用于控制 goroutine 生命周期的机制。context 的取消可以通过两种方式实现:一是通过 context.WithCancel 创建一个可以手动取消的 context,二是通过 context.WithTimeout 或 context.WithDeadline 创建一个会在超时或达到指定时间时自动取消的 context。当 context 被取消时,通过 context 传递的 Done() channel 会被关闭,goroutine 可以通过 select 语句检测 Done()
channel 是否关闭来判断是否需要终止工作。
Step 2
Q:: context 包中的不同类型的 Context 有哪些?
A:: Go 中的 context 包定义了四种类型的 Context:Background、TODO、WithCancel 和 WithDeadline/
WithTimeout。Background 和 TODO 是两个预定义的根 context,通常用作 context 树的根节点。WithCancel 创建一个可手动取消的 context,WithDeadline 和 WithTimeout 创建一个会在指定时间后自动取消的 context。这些 context 通常会通过嵌套来创建更复杂的取消链,确保 goroutine 能够正确终止,避免资源泄漏。
Step 3
Q:: 如何优雅地处理 context 被取消的场景?
A:: 在处理 context 被取消的场景时,应该使用 select 语句监听 context 的 Done() channel,并在 channel 关闭时及时退出当前 goroutine。通常,这意味着你需要在你的长时间运行的操作中定期检查 Done() channel,例如在循环或 I/
O 操作之间。另外,在函数返回前,应该确保所有资源(如文件句柄、网络连接等)都已正确关闭,以避免资源泄漏。