diff --git a/channel/signal-context/main.go b/channel/signal-context/main.go new file mode 100644 index 0000000..0cf0c35 --- /dev/null +++ b/channel/signal-context/main.go @@ -0,0 +1,30 @@ +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() + + } +}