Go context.CancelFunc 的代码使用案例

23 min read

以下是Go中使用context.CancelFunc的代码示例:

package main

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

func worker(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("Worker stopped")
			return
		default:
			fmt.Println("Worker is running")
			time.Sleep(time.Second)
		}
	}
}

func main() {
	ctx, cancel := context.WithCancel(context.Background())

	go worker(ctx)

	time.Sleep(5 * time.Second)

	cancel()

	time.Sleep(2 * time.Second)
	fmt.Println("Main stopped")
}

在这个示例中,worker是一个后台任务,它不断运行并打印信息。在主函数中,我们使用context.WithCancel创建了一个新的上下文,并返回该上下文和一个cancel函数。然后我们启动worker,并让它运行了5秒钟。在这之后,我们调用cancel函数终止worker任务。此后,我们加入2秒的延迟以等待worker最终终止,然后打印“Main stopped”来标记程序的结束。注意在worker中我们使用select语句监听ctx.Done(),一旦这个channel被关闭,worker就会停止运行。而调用cancel函数就会关闭这个channel,让worker停止。