0
点赞
收藏
分享

微信扫一扫

Go context.CancelFunc 取消一个 Context



阅读目录

  • Go context.CancelFunc 取消一个 Context


Go context.CancelFunc 取消一个 Context

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

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

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

package main

import (
	"context"
	"fmt"
	"time"
)

type MiraMenu struct {
	cancel context.CancelFunc
}

func main() {
	// 创建一个父Context和取消函数
	parentCtx, cancel := context.WithCancel(context.Background())

	// 创建一个MiraMenu实例
	menu := MiraMenu{
		cancel: cancel,
	}

	// 启动一个goroutine来执行一些任务
	go menu.doSomething(parentCtx)

	// 等待一段时间后取消操作
	time.Sleep(2 * time.Second)
	menu.cancel()

	// 等待一段时间让任务完成
	time.Sleep(1 * time.Second)
}

func (m *MiraMenu) doSomething(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("任务已取消")
			return
		default:
			fmt.Println("正在执行任务")
			time.Sleep(500 * time.Millisecond)
		}
	}
}

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

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

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

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

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

PS D:\TEXT\test> go run .\hello.go
正在执行任务
正在执行任务
正在执行任务
正在执行任务
任务已取消
PS D:\TEXT\test>


举报

相关推荐

0 条评论