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>
还没有评论,来说两句吧...