zoukankan      html  css  js  c++  java
  • [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()
            }
        }
    }

    完整代码:

    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)
            }
        }
    }
  • 相关阅读:
    CentOS7学习小记
    PHP的time函数返回时间不正确
    MySQL信息提示不是英文问题
    windows下ITOP安装
    Zend安装
    投资日记2015.6
    解决SecureCRT连接linux超时后断开[转]
    红黑树及生成超过32768随机数
    在宏定义中怎么使用可变参数
    C++堆上申请二维数组
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11871405.html
Copyright © 2011-2022 走看看