有时候我们需要 Ctrl+C 强行退出程序,并且退出之前还需要做一些收尾工作,比如缓存落盘等。代码如下
- closing,代表程序退出,但是清理工作还没做;
- closed,代表清理工作已经做完。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { var closing = make(chan struct{}) var closed = make(chan struct{}) go func() { // 模拟业务处理 for { select { case <-closing: return default: // ....... 业务计算 time.Sleep(100 * time.Millisecond) } } }() // 处理CTRL+C等中断信号 termChan := make(chan os.Signal) signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM) <-termChan close(closing) // 执行退出之前的清理动作 go doCleanup(closed) select { case <-closed: case <-time.After(time.Second * 3): fmt.Println("清理超时,不等了") } fmt.Println("优雅退出") } func doCleanup(closed chan struct{}) { time.Sleep((time.Minute)) close(closed) } |
© 著作权归作者所有
文章评论(0)