Go context.CancelFunc 取消一个 Context

以你之姓@ 2023-10-12 09:51 189阅读 0赞

阅读目录

  • Go context.CancelFunc 取消一个 Context

Go context.CancelFunc 取消一个 Context

Go 语言中,context.CancelFunc 是一个函数类型,用于取消一个context.Context的操作。

当调用 CancelFunc 时,与之关联的 Context 会被取消,所有依赖于该 Context 的操作都会收到取消信号。

下面是一个示例,演示如何使用context.CancelFunc取消一个Context:

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. )
  7. type MiraMenu struct {
  8. cancel context.CancelFunc
  9. }
  10. func main() {
  11. // 创建一个父Context和取消函数
  12. parentCtx, cancel := context.WithCancel(context.Background())
  13. // 创建一个MiraMenu实例
  14. menu := MiraMenu{
  15. cancel: cancel,
  16. }
  17. // 启动一个goroutine来执行一些任务
  18. go menu.doSomething(parentCtx)
  19. // 等待一段时间后取消操作
  20. time.Sleep(2 * time.Second)
  21. menu.cancel()
  22. // 等待一段时间让任务完成
  23. time.Sleep(1 * time.Second)
  24. }
  25. func (m *MiraMenu) doSomething(ctx context.Context) {
  26. for {
  27. select {
  28. case <-ctx.Done():
  29. fmt.Println("任务已取消")
  30. return
  31. default:
  32. fmt.Println("正在执行任务")
  33. time.Sleep(500 * time.Millisecond)
  34. }
  35. }
  36. }

在上面的示例中,我们创建了一个MiraMenu结构体,其中包含一个cancel字段,该字段的类型为context.CancelFunc。

在main函数中,我们创建了一个父Context和相应的取消函数cancel,然后将取消函数赋值给MiraMenu实例的cancel字段。

接着,我们在一个单独的goroutine中执行menu.doSomething方法,该方法会持续执行一个任务。在任务执行过程中,我们使用select语句来检查Context的取消状态。如果取消函数被调用,ctx.Done()会接收到信号,我们会打印出”任务已取消”并返回函数,终止任务的执行。

在主goroutine中,我们等待2秒钟后调用menu.cancel(),这会触发取消操作。然后我们再等待1秒钟,以便任务有足够的时间来执行完成。

运行上述示例代码,你将会看到输出类似于以下内容:

  1. PS D:\TEXT\test> go run .\hello.go
  2. 正在执行任务
  3. 正在执行任务
  4. 正在执行任务
  5. 正在执行任务
  6. 任务已取消
  7. PS D:\TEXT\test>

发表评论

表情:
评论列表 (有 0 条评论,189人围观)

还没有评论,来说两句吧...

相关阅读

    相关 go - context 用法

    1,context作用 1,通过context,我们可以方便地对同一个请求所产生地goroutine进行约束管理,可以设定超时、deadline,甚至是取消这个请求相关的