golang context 应用

发布时间 2023-05-23 14:54:18作者: securitybob
package main

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

func main() {
	// 创建初始上下文
	ctx := context.Background()

	// 派生可取消的上下文
	cancelCtx, cancel := context.WithCancel(ctx)

	// 启动一个 Goroutine 执行任务
	go doTask(cancelCtx)

	// 等待一段时间后取消任务
	time.Sleep(1 * time.Second)
	cancel() // 调用 cancel 函数取消任务

	// 等待任务结束
	time.Sleep(1 * time.Second)
}

func doTask(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("Task canceled")
			return
		default:
			fmt.Println("Running task...")
			time.Sleep(500 * time.Millisecond)
		}
	}
}
在上述示例中,我们首先使用 context.Background() 创建了一个初始的上下文 ctx。然后,使用 context.WithCancel(ctx) 派生了一个可取消的上下文 cancelCtx 和相应的取消函数 cancel。接下来,我们在 doTask() 函数中执行一个任务,并在每次循环中检查上下文的取消信号。

在主函数中,我们等待一段时间后,调用 cancel() 函数取消任务。这会触发与 cancelCtx 关联的上下文的取消信号,使得 doTask() 函数可以感知到任务已被取消,并退出执行。

总之,context.WithCancel(ctx) 用于派生一个可取消的上下文,并返回与之关联的取消函数。通过调用取消函数,可以触发与上下文相关的 Goroutine 的取消信号,从而实现对任务的取消和中止。