Go 语言面试题
目录

Go 语言中如何使用 context.WithCancel 取消 goroutine?

· 约 3 分钟读完 · 第 73 / 175 章

推荐答案

在 Go 语言中,可以使用 context.WithCancel 来创建一个带有取消功能的上下文(context),并通过该上下文来取消正在运行的 goroutine。以下是一个简单的示例:

在这个示例中,context.WithCancel 创建了一个可取消的上下文 ctx 和一个取消函数 cancel。当调用 cancel() 时,ctx.Done() 会返回一个关闭的 channel,goroutine 可以通过监听这个 channel 来响应取消信号并退出。

本题详细解读

1. context.WithCancel 的作用

context.WithCancel 是 Go 语言中用于创建可取消上下文的一个函数。它返回两个值:

  • ctx:一个新的上下文对象,带有取消功能。
  • cancel:一个取消函数,调用该函数会取消上下文。

2. 如何取消 goroutine

在示例中,worker 函数是一个无限循环的 goroutine,它通过 select 语句监听 ctx.Done() 返回的 channel。当 cancel() 被调用时,ctx.Done() 会返回一个关闭的 channel,select 语句会立即执行 case <-ctx.Done(): 分支,从而让 goroutine 退出。

3. 使用场景

context.WithCancel 通常用于控制多个 goroutine 的生命周期。例如,在 HTTP 请求处理中,可以使用 context.WithCancel 来取消所有与请求相关的后台操作,以避免资源浪费。

4. 注意事项

  • 调用 cancel() 后,ctx.Done() 会立即返回一个关闭的 channel,但 goroutine 的退出是异步的,因此需要适当的时间来确保所有 goroutine 都已退出。
  • context.WithCancel 创建的上下文是树形结构的,取消父上下文会同时取消所有子上下文。

通过这种方式,可以有效地管理和控制 goroutine 的生命周期,避免资源泄漏和无效操作。