• 1.11 程序优雅退出


    package main
    
    import (
    	"fmt"
    	"io"
    	"log"
    	"os"
    	"os/signal"
    	"syscall"
    	"time"
    )
    
    var writer *os.File
    
    func main() {
    
    	// The file is opened as
    	// a log file to write into.
    	// This way we represent the resources
    	// allocation.
    	var err error
    	writer, err = os.OpenFile(fmt.Sprintf("test_%d.log", time.Now().Unix()), os.O_RDWR|os.O_CREATE, os.ModePerm)
    	if err != nil {
    		panic(err)
    	}
    
    	// The code is running in a goroutine
    	// independently. So in case the program is
    	// terminated from outside, we need to
    	// let the goroutine know via the closeChan
    	closeChan := make(chan bool)
    	go func() {
    		for {
    			time.Sleep(time.Second)
    			select {
    			case <-closeChan:
    				log.Println("Goroutine closing")
    				return
    			default:
    				log.Println("Writing to log")
    				io.WriteString(writer, fmt.Sprintf("Logging access %s
    ", time.Now().String()))
    			}
    
    		}
    	}()
    
    	sigChan := make(chan os.Signal, 1)
    	signal.Notify(sigChan,
    		syscall.SIGTERM,
    		syscall.SIGQUIT,
    		syscall.SIGINT)
    
    	// This is blocking read from
    	// sigChan where the Notify function sends
    	// the signal.
    	<-sigChan
    
    	// After the signal is received
    	// all the code behind the read from channel could be
    	// considered as a cleanup
    	close(closeChan)
    	releaseAllResources()
    	fmt.Println("The application shut down gracefully")
    }
    
    func releaseAllResources() {
    	io.WriteString(writer, "Application releasing all resources
    ")
    	writer.Close()
    }
    
    /*
    
    2018/03/17 23:05:10 Writing to log
    2018/03/17 23:05:11 Writing to log
    2018/03/17 23:05:12 Writing to log
    2018/03/17 23:05:13 Writing to log
    The application shut down gracefully
    */
    
    
  • 相关阅读:
    Python 中的一些小技巧
    Java/Python/Elixir 正则库使用上的注意事项
    Scrapy 学习笔记(一)数据提取
    记第一次面试
    Spring Web MVC 笔记
    Java 单元测试
    Spring 笔记(四)AOP
    C 语言 进阶
    编程的智慧
    Spring 笔记(三)Bean 装配
  • 原文地址:https://www.cnblogs.com/zrdpy/p/8593465.html
Copyright © 2020-2023  润新知