[Go] gocron源碼閱讀-groutine與channel應用到信號捕獲

直接使用go 函數名()能夠開啓一個grountine,channel能夠接收信息而且若是沒有數據時會阻塞住
channel對應的是底層數據結構的引用,複製channel和函數傳參都是拷貝的引用
make的時候第二個參數是1,就表示是有緩存的channel緩存

無緩存的channel也叫同步channel數據結構

    c = make(chan interface{})
    //開啓groutine
    go mySig()
    //主grountine不能斷
    for {
        time.Sleep(time.Second)
        c <- "taoshihan"
    }
func mySig() {
    for {
        str := <-c
        fmt.Println(str)
    }
}

 

信號處理使用channel通訊函數

func catchSignal() {
    c := make(chan os.Signal, 1)
    signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
    for {
        s := <-c
        logger.Info("收到信號 -- ", s)
        switch s {
        case syscall.SIGHUP:
            logger.Info("收到終端斷開信號, 忽略")
        case syscall.SIGINT, syscall.SIGTERM:
            shutdown()
        }
    }
}

完整代碼:spa

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

var c chan interface{}

func main() {
    go catchSignal()

    c = make(chan interface{})
    //開啓groutine
    go mySig()
    //主grountine不能斷
    for {
        time.Sleep(time.Second)
        c <- "taoshihan"
    }

}
func mySig() {
    for {
        str := <-c
        fmt.Println(str)
    }
}
func catchSignal() {
    d := make(chan os.Signal, 1)
    signal.Notify(d, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
    for {
        s := <-d
        fmt.Println("收到信號 -- ", s)
        switch s {
        case syscall.SIGHUP:
            fmt.Println("收到終端斷開信號, 忽略")
        case syscall.SIGINT, syscall.SIGTERM:
            //這裏能夠作一些退出動做
            fmt.Println("關閉")
            os.Exit(0)
        }
    }
}
相關文章
相關標籤/搜索