golanglearn/channel/signal-context/main.go

31 lines
621 B
Go

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()
}
}