package main import ( "context" "log" "os" "os/signal" "syscall" "time" ) func main() { ctx, cancelFunc := context.WithTimeout(context.Background(), time.Second*2) waitForFinish(ctx, cancelFunc) } //waitForFinish 带context的退出 func waitForFinish(ctx context.Context, cancel context.CancelFunc) { log.Println("waiting for finish...") sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) select { case <-ctx.Done(): log.Println("ctx done") break case <-sigChan: log.Println("got termination signal,canceling execution...") cancel() } }