package main

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

// 模拟一个可能很慢的操作
func slowJob(ctx context.Context) error {
	for i := 1; i <= 5; i++ {
		select {
		case <-ctx.Done():
			fmt.Println("slowJob 被取消:", ctx.Err())
			return ctx.Err()
		default:
			fmt.Println("slowJob 进行中 step", i)
			time.Sleep(1 * time.Second)
		}
	}
	fmt.Println("slowJob 正常完成")
	return nil
}

func main() {
	// 最多给 slowJob 3 秒时间
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()

	fmt.Println("开始执行 slowJob，超时时间 3 秒...")
	if err := slowJob(ctx); err != nil {
		fmt.Println("结束，原因:", err)
		return
	}

	fmt.Println("结束：正常完成")
}
